<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/242685</link>
    <title>MATLAB Central Newsreader - solve dot(x,y)&lt;=z  for x</title>
    <description>Feed for thread: solve dot(x,y)&lt;=z  for x</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Mon, 19 Jan 2009 16:22:01 -0500</pubDate>
      <title>solve dot(x,y)&lt;=z  for x</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/242685#622542</link>
      <author>Oriole </author>
      <description>Hello, Happy new year.&lt;br&gt;
&lt;br&gt;
I would appreciate your advice...&lt;br&gt;
&lt;br&gt;
Problem:  solve dot(x,y)&amp;lt;=z  for x, list all solutions&lt;br&gt;
&lt;br&gt;
Input (knowns):  z: a positive real number (scalar)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y: a n-d vector of positive numbers, sorted in ascending order&lt;br&gt;
&lt;br&gt;
Output(unknowns)  x : a n-d vector of non-negative integers&lt;br&gt;
&lt;br&gt;
Basic idea of my solution:  I lexicographically list out the candidates for solutions, while checking the condition  &quot;dot(x,y)&amp;lt;=z&quot;.&lt;br&gt;
&lt;br&gt;
For example,  z = 3.8,  y =[1.213, 2.142, 3.112], &lt;br&gt;
&lt;br&gt;
my code would be&lt;br&gt;
&lt;br&gt;
y=[1.213, 2.142, 3.112];&lt;br&gt;
z =3.8;&lt;br&gt;
n= length(y);                        % dimension of input vector y&lt;br&gt;
x= zeros(1,n);                       % solution vector x&lt;br&gt;
X = [];                                  % matrix storing all solution vectors x&lt;br&gt;
flag =1;&lt;br&gt;
while  flag ==1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X = [X; x];    &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flag =0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for j= n:-1:1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if  dot (x (1:j), y(1:j))+ y(j) &amp;lt;= z&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x(j+1:n) =0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x(j) = x(j)+1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flag = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
X                                            % display the solution&lt;br&gt;
&lt;br&gt;
It works quite fast, for moderate n and z.  But since I tend to always use less efficient approach, I would like to hear your opinions about it.</description>
    </item>
    <item>
      <pubDate>Mon, 19 Jan 2009 17:49:03 -0500</pubDate>
      <title>Re: solve dot(x,y)&lt;=z  for x</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/242685#622563</link>
      <author>Gene </author>
      <description>&quot;Oriole &quot; &amp;lt;oriole_ni@hotmail.com&amp;gt; wrote in message &amp;lt;gl29b9$6tb$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Hello, Happy new year.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I would appreciate your advice...&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Problem:  solve dot(x,y)&amp;lt;=z  for x, list all solutions&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Input (knowns):  z: a positive real number (scalar)&lt;br&gt;
&amp;gt;                          y: a n-d vector of positive numbers, sorted in ascending order&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Output(unknowns)  x : a n-d vector of non-negative integers&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Basic idea of my solution:  I lexicographically list out the candidates for solutions, while checking the condition  &quot;dot(x,y)&amp;lt;=z&quot;.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; For example,  z = 3.8,  y =[1.213, 2.142, 3.112], &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; my code would be&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; y=[1.213, 2.142, 3.112];&lt;br&gt;
&lt;br&gt;
Oriole:&lt;br&gt;
&lt;br&gt;
I'm not sure I fully understand your problem, but the inequality dot(x, y) &amp;lt;= z will have infinitely many solutions. Matlab provides some tools for characterizing the the set of solutions.&lt;br&gt;
&lt;br&gt;
First, consider the problem dot(x, y) = 0.  Geometrically, this is a plane through the origin; all points on it are orthogonal (perpendicular) to the y vector (assumed nonzero).&lt;br&gt;
&amp;gt; z =3.8;&lt;br&gt;
&amp;gt; n= length(y);                        % dimension of input vector y&lt;br&gt;
&amp;gt; x= zeros(1,n);                       % solution vector x&lt;br&gt;
&amp;gt; X = [];                                  % matrix storing all solution vectors x&lt;br&gt;
&amp;gt; flag =1;&lt;br&gt;
&amp;gt; while  flag ==1&lt;br&gt;
&amp;gt;     X = [X; x];    &lt;br&gt;
&amp;gt;     flag =0;&lt;br&gt;
&amp;gt;     for j= n:-1:1&lt;br&gt;
&amp;gt;         if  dot (x (1:j), y(1:j))+ y(j) &amp;lt;= z&lt;br&gt;
&amp;gt;             x(j+1:n) =0;&lt;br&gt;
&amp;gt;             x(j) = x(j)+1;&lt;br&gt;
&amp;gt;             flag = 1;&lt;br&gt;
&amp;gt;             break&lt;br&gt;
&amp;gt;         end&lt;br&gt;
&amp;gt;     end&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt; X                                            % display the solution&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; It works quite fast, for moderate n and z.  But since I tend to always use less efficient approach, I would like to hear your opinions about it.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Oriole:&lt;br&gt;
&lt;br&gt;
I'm not sure I fully understand your problem, but the inequality dot(x, y) &amp;lt;= z will have infinitely many solutions. Matlab provides some tools for characterizing the set of solutions. &lt;br&gt;
&lt;br&gt;
First, consider the problem dot(x, y) = 0. For nonzero y this is a plane through the origin; it is the set of vectors orthogonal to the vector y. If you think of the row vector y  as the representation of a linear map from the x-space to the scalars then we want the  null space of the map. Matlab provides the 'null' function. For the y vector in your posting&lt;br&gt;
&amp;gt;&amp;gt; xx = null(y)&lt;br&gt;
&lt;br&gt;
xx =&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;-0.5398   -0.7843&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.7768   -0.3243&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;-0.3243    0.5289&lt;br&gt;
&lt;br&gt;
Any vector formed as linear combination of these two columns will lead to a vector 'x' with dot(x, y) = 0.&lt;br&gt;
&lt;br&gt;
To any such vector add beta*y where the scalar beta is &amp;lt;= z/dot(y,y).  In Matlab-ese&lt;br&gt;
&lt;br&gt;
x = xx(:,1)*alpha_1 + xx(:,2)*alpha_2 + beta*y&lt;br&gt;
&lt;br&gt;
It may be helpful to draw a picture in two dimensions.&lt;br&gt;
&lt;br&gt;
I hope this helps&lt;br&gt;
&lt;br&gt;
e.m.cliff </description>
    </item>
    <item>
      <pubDate>Mon, 19 Jan 2009 18:50:18 -0500</pubDate>
      <title>Gene</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/242685#622576</link>
      <author>Oriole </author>
      <description>Thank you Gene, &lt;br&gt;
The solution &quot;x&quot; is supposed to be a vector of integers and being non-negative, so there should be finite nunber of solutions.... &lt;br&gt;
Oriole</description>
    </item>
    <item>
      <pubDate>Mon, 19 Jan 2009 20:05:04 -0500</pubDate>
      <title>Re: Gene</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/242685#622592</link>
      <author>Bruno Luong</author>
      <description>function x=solvedot(z, y, head)&lt;br&gt;
&lt;br&gt;
n = length(y);&lt;br&gt;
x = (0:floor(z/y(1))).';&lt;br&gt;
if n&amp;gt;1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% recursive call&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;z = z-y(1).*x;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y = y(2:end);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = cell2mat(arrayfun(@(z,x) solvedot(z, y, x), z, x, ...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'UniformOutput', false));&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
if nargin&amp;gt;=3 % add a head column&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = [head+zeros(size(x,1),1) x];&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
end % solvedot&lt;br&gt;
&lt;br&gt;
% Command line&lt;br&gt;
&amp;nbsp;x=solvedot(3.8, [1.213, 2.142, 3.112])&lt;br&gt;
&lt;br&gt;
% Bruno&lt;br&gt;
&lt;br&gt;
% Bruno</description>
    </item>
    <item>
      <pubDate>Mon, 19 Jan 2009 20:40:18 -0500</pubDate>
      <title>Re: Gene</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/242685#622598</link>
      <author>Matt Fig</author>
      <description>I don't necessarily think this is more efficient, but here is a vectorized approach.&lt;br&gt;
&lt;br&gt;
function X = solvedott(z,y)&lt;br&gt;
lngth = length(y);&lt;br&gt;
X = repmat({0:max(floor(z./y(y~=0)))},1,lngth) ;&lt;br&gt;
[X{1:lngth}] = ndgrid(X{:}); &lt;br&gt;
X = fliplr(reshape(cat(lngth+1,X{:}),[],lngth)) ;&lt;br&gt;
Y = y(ones(1,size(X,1)),1:lngth);&lt;br&gt;
X = X(sum(X.*Y,2)&amp;lt;=z,:);&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
_UYfQ*QdS``0}YdvU_Q\o]W\_dve=]_oeoSRooQQ_UX[U^_oXRIQoXoi5Q^</description>
    </item>
    <item>
      <pubDate>Mon, 19 Jan 2009 21:04:02 -0500</pubDate>
      <title>Re: Gene</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/242685#622605</link>
      <author>Bruno Luong</author>
      <description>% Brute force&lt;br&gt;
function X=solvedottt(z, y)&lt;br&gt;
n=length(y);&lt;br&gt;
p = cellfun(@(c) (0:c), num2cell(z./y), 'UniformOutput', false);&lt;br&gt;
[p{:}] = ndgrid(p{:});&lt;br&gt;
X=cat(n+1,p{:});&lt;br&gt;
X=reshape(X,[],n);&lt;br&gt;
Xy=X*y(:);&lt;br&gt;
X(Xy&amp;gt;z,:)=[];&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% Bruno</description>
    </item>
    <item>
      <pubDate>Mon, 19 Jan 2009 22:34:01 -0500</pubDate>
      <title>Bruno, Matt</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/242685#622617</link>
      <author>Oriole </author>
      <description>Thank you very much,  Bruno and Matt, I will try on your suggestions. Matt, I asked you a question in a old post of mine, would you please have a look at it.&lt;br&gt;
&lt;br&gt;
find vector r&amp;lt;=p (p: a given vector)&lt;br&gt;
&lt;a href=&quot;http://www.mathworks.com/matlabcentral/newsreader/view_thread/238871&quot;&gt;http://www.mathworks.com/matlabcentral/newsreader/view_thread/238871&lt;/a&gt;</description>
    </item>
  </channel>
</rss>

