matlab文档用
解释了vectorizationi = 0; for t = 0:.01:10 i = i + 1; y(i) = sin(t); end This is a vectorized version of the same code: t = 0:.01:10; y = sin(t);
我可以将矢量化应用于具有非标量输入和输出的函数吗?作为玩具示例,请使用函数foo
function out = foo(in)
out(1) = in(1);
out(2) = in(2);
end
这只是身份。我想做像
这样的事情inputs = [1,2; 3,4; 5,6];
t = 1:3;
outputs = foo(inputs(t,:))
并获取
ans =
1 2
3 4
5 6
相反,我最终得到了
ans =
1 3
显然,我做错了或者不可能。救命啊!
答案 0 :(得分:1)
可以在Matlab中以N维进行矢量化。正如安德鲁所提到的,你可以简单地写一个像:
这样的函数function out = foo(in)
out(:,1:size(in,2)) = in(:,1:size(in,2));
end
输出将符合要求。
答案 1 :(得分:1)
在n维数组上使用(:)索引运算符可以对所有元素执行向量化操作。你可以用例如重塑以将结果返回到与输入相同的形式。
function out=foo(in)
out=reshape(in(:),size(in));
答案 2 :(得分:0)
意外输出
输出为[1 3]
的原因与矩阵的线性索引有关。特别是这意味着您可以使用向量访问整个矩阵,其中您首先计算第一列,然后是第二列,依此类推。对于3x2
矩阵,这将是:
1 4
2 5
3 6
因此in(1) = 1
是第一列中的第一个元素。 in(2) = 3
是第一列中的第二个元素。查找矩阵索引here的完整文档。
输入
其次写outputs = foo(inputs(t,:))
意味着您将t
中指定的所有行都没有条件地放到列中。因此,在您的示例中,当您放入所有3行时,它等同于写outputs = foo(inputs)
和outputs = foo(inputs(t,:))
。你可以做的是让foo()
有两个参数。
function out = foo(t,in)
out = in(t,:)
要访问函数内部的行,您可以编写如下内容:
function out = foo(in);
[x,y] = size(in);
for t = 1:x
out(t,:) = in(t,:);
end
通常使用矢量化来避免通过标量循环。有许多聪明的方法可以简化代码并减少计算时间。大多数技术(如.* ,.^, bsxfun()
)已在您已找到的vectorization文档中提供。棘手的部分是找到应用这些方法的正确方法。它需要大量的经验和敏锐的眼光来充分利用它们,因为在每种情况下你都需要适应你的选择的具体逻辑。
随时问你是否还在努力解决问题。