以矢量化形式调用内置的matlab函数(repmap,ones)

时间:2014-11-26 10:35:36

标签: matlab matrix vector vectorization

我目前正试图通过用向量化函数调用替换循环,以更优雅的方式开始使用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文档,但它对这个特定问题没有帮助。

先谢谢你们!

1 个答案:

答案 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