在没有循环,八度音程的矩阵的所有行上操作

时间:2013-05-10 12:26:35

标签: octave vectorization

假设我有一个矩阵A,我想获得以下内容:

for i=1:m
  A(i,:) = something which depends on i;
endfor

有没有办法在没有循环的情况下获得它?

已添加:好的,我知道我必须更加具体。
我有两个矩阵BC(我们考虑的所有矩阵都有m行)。
我想在第iA中记录iBC中写的多项式的乘积(所以使用循环我会调用转换函数)。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这是一个非常普遍的问题,不可能回答更多细节。主要是i将涉及的内容。假设以下

for i = 1:m
  A(i,:) += i;
endfor

它可以用更高效的方式编写:

A .+ (1:m)'

比较一下:

octave> n = 1000;
octave> A = B = rand (n);
octave> tic; for i = 1:n, B(i,:) += i; endfor; toc
Elapsed time is 0.051 seconds.
octave> tic; C = A.+ (1:n)'; toc
Elapsed time is 0.01 seconds.
octave> isequal (C, B)
ans =  1

如果您有一个非常旧版本的八度音阶,则可以改为bsxfun (@plus, A, (i:m)')

但是,如果表达式右侧的i将用于索引其他一些变量,那么解决方案就会有所不同。也许,解决方案是cumsum,或其他cumfoo函数。

你的问题基本上是“如何对代码进行矢量化?”,这是一个非常大的主题,并没有告诉我们你想要进行矢量化。

答案 1 :(得分:0)

我不认为没有for循环就可以这样做,因为conv只接受矢量输入,但我可能错了。我看不到将bsxfunarrayfunconv和矩阵输入结合使用的方法。我可能错了......我有待纠正。