我目前正试图通过用向量化函数调用替换循环,以更优雅的方式开始使用Matlab。但是,在某些情况下,我无法完成转换。其中一个如下所示:
for i = 1:3
ones(i,i)
end
我试过
i = 1:3
ones(i,i)
%or
ones([i,i])
但不是给我3个不同的矩阵,而是得到一个6D矩阵,因为我只是连接到[1,2,3,1,2,3]。我怎样才能实现我打算做的事情,这是
[1]
[1 1;
1 1]
[1 1 1;
1 1 1;
1 1 1]
同样,我会进行以下调用:
x = zeros(3)
i = 1:3
x(i,1:1) = repmat(i,1,i)
我希望看到的是:
x =
[1 0 0;
2 2 0;
3 3 3]
第一个问题涉及如何以矢量化形式调用函数,第二个问题更多地涉及使用索引向量的动态矩阵或向量索引。 我确实阅读了关于Vectorization的Matlab文档,但它对这个特定问题没有帮助。
先谢谢你们!
答案 0 :(得分:1)
对于第一种情况,
out = arrayfun(@(n) ones(n),1:3,'Uni',0) %// Not a vectorized solution though!
%// It is not possible to have a vectorized solution
%// as you are looking to have three different matrices
[x1,x2,x3] = deal(out{:}) %// save into different variables
输出 -
x1 =
1
x2 =
1 1
1 1
x3 =
1 1 1
1 1 1
1 1 1
对于第二种情况,
ii = 1:3;
x = tril(repmat(ii',[1 3]))
或者这个 -
ii = 1:3;
x = bsxfun(@ge,[1:3]',1:3).*repmat(ii',[1 3])
或者这个 -
ii = 1:3;
x = repmat(ii',[1 3]);
x(bsxfun(@lt,[1:3]',1:3))=0;
输出 -
x =
1 0 0
2 2 0
3 3 3