假设我有一个矩阵A,我想获得以下内容:
for i=1:m
A(i,:) = something which depends on i;
endfor
有没有办法在没有循环的情况下获得它?
已添加:好的,我知道我必须更加具体。
我有两个矩阵B
和C
(我们考虑的所有矩阵都有m
行)。
我想在第i
行A
中记录i
行B
和C
中写的多项式的乘积(所以使用循环我会调用转换函数)。
有什么想法吗?
答案 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
只接受矢量输入,但我可能错了。我看不到将bsxfun
或arrayfun
与conv
和矩阵输入结合使用的方法。我可能错了......我有待纠正。