【问题标题】:create matrix function of vector input variable (Matlab)创建向量输入变量的矩阵函数(Matlab)
【发布时间】:2016-06-13 18:30:24
【问题描述】:

我无法创建满足我需求的函数。我正在尝试创建一个匿名函数,它在接受长度为 N 的向量时会生成一个 NxN 矩阵。我想填充矩阵的每个元素(即,使用循环)。一个更具体的简短示例:

N = 2;
Qjk = @(x,y) x * y;

for j = 1:N
  for k = 1:N

     Q(j,k) =@(x) Qjk(x(k),rand);

  end
end

最后这应该产生,例如:

Q = @(x) [.23*x(1), .16*x(2); .95*x(1), .62*x(2)]

我可以手动编写上面的最终表达式,它可以按要求工作,但我无法通过循环/矢量化来自动化这个过程。谢谢。

【问题讨论】:

  • 其他人有什么建议吗?

标签: matlab matrix vector anonymous-function matrix-multiplication


【解决方案1】:

所以我的理解是,您希望创建一个 N x N 元素矩阵,其中输入是长度为 N?... 的向量,更具体地说,您希望获取输入向量中的每个元素 @ 987654324@ 并生成一个新的1 x N 向量,其中x 中的每个元素都被这个新的1 x N 向量缩放?

你可以使用bsxfun避免循环:

Q = bsxfun(@times, x(:).', rand(numel(x)));

我不确定x 是什么形状,是行向量还是列向量,但我不会做任何假设。 x(:).' 将确保您的向量成为行向量。但是,如果您想让您的代码正常工作,请去掉实际循环本身中的匿名函数声明。此外,您可能需要调用 Qjk,因为这是您声明的函数,而不是 Q,因为这是您要填充的矩阵。

简单地做:

N = 2;
Q = zeros(N); % New - Allocate to be more efficient
Qjk = @(x,y) x * y;

for j = 1:N
  for k = 1:N

     Q(j,k) = Qjk(x(k),rand); % Change

  end
end

【讨论】:

  • 删除匿名函数调用后,上面的内容是的。我只是直接填充了矩阵。你不能只用bsxfun吗?它做你想做的事,如果你愿意,你甚至可以把它包装成一个匿名函数。 Q = @(x) bsxfun(@times, x(:).', rand(numel(x)));.
  • 嗨,Ray,实际上这些解决方案并没有达到我想要的效果 - 我希望结果是 x 的匿名函数。这两个似乎都需要我先定义x。有什么想法吗?
  • 这:Q = @(x) bsxfun(@times, x(:).', rand(numel(x))); 不需要您先定义x。它只是我上面写的相同的代码,但包装在一个匿名函数中。因此,您只需输入一个向量,它就会为您输出一个N x N 矩阵。
  • 确实如此。我知道这里有很多 bsxfun 的爱,但是有没有办法用 for 循环来做到这一点?我正在交出这段代码,我认为其他人发现 for 循环更具可读性(无论好坏)。
  • 你不能在匿名函数中编写循环......至少不能原生......如果你想这样做,你必须滥用eval。执行您要求的最佳方法之一是使用bsxfun。但是,让我先尝试了解您在其他代码中所做的事情...您是否要创建匿名函数矩阵?...您只能使用元胞数组。
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2016-10-13
  • 1970-01-01
相关资源
最近更新 更多