在matlab中,可以在多个维度进行矢量化吗?

时间:2015-10-26 03:04:20

标签: matlab vectorization

matlab文档用

解释了vectorization
i = 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

显然,我做错了或者不可能。救命啊!

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文档中提供。棘手的部分是找到应用这些方法的正确方法。它需要大量的经验和敏锐的眼光来充分利用它们,因为在每种情况下你都需要适应你的选择的具体逻辑。

随时问你是否还在努力解决问题。