Performance 如何快速用所有N元数填充矩阵?

Performance 如何快速用所有N元数填充矩阵?,performance,matlab,matrix,Performance,Matlab,Matrix,这真是太愚蠢了,我想做的就是让一个7列的矩阵包含所有mod 7的数字,利用下面的代码生成这样一个矩阵需要花费大量的时间 to = 7^k; msgValue = zeros(to,k); for l=0:to for kCounter=0:(k-1) msgValue(l+1,kCounter+1)=mod((l/7^kCounter),7); end end msgValue = floor(msgValue); 我怎样才能做得更快 我使用了matlab c

这真是太愚蠢了,我想做的就是让一个7列的矩阵包含所有mod 7的数字,利用下面的代码生成这样一个矩阵需要花费大量的时间

to = 7^k;
msgValue = zeros(to,k);
for l=0:to
    for kCounter=0:(k-1)
        msgValue(l+1,kCounter+1)=mod((l/7^kCounter),7);
    end 
end
msgValue = floor(msgValue);

我怎样才能做得更快

我使用了matlab central中的一个名为的子模块,我经常使用它,它能够消除一个for循环,并在一定程度上对代码进行矢量化

tic
k=7;
modval = 7;
to=modval^k;
mods = mod(0:(modval-1),modval);
msgValue=zeros(to,k);
for kCounter=1:k
    aux = rude(modval^(kCounter-1)*ones(1,modval),mods)';
    msgValue(:,kCounter) = repmat(aux,to/(7^kCounter),1);
end
toc
代码背后的思想是在每次迭代开始时使用roude函数生成列向量的构建块。反过来,Rude使用mods=[01 2 3 4 5 6]作为操作的起点。真正的工作是通过矢量化完成的

您没有提到代码运行需要多长时间。所以我只对它计时一次,给你一个大致的想法。它在我的机器上运行了0.43秒,这台机器是Windows7Ultimate,2.4GHz,4GB内存,双CPU

此外,定义循环的方式会在msgValue矩阵中添加重复。第一行由所有列中的零值组成,最后一行也是如此,我也修正了这一点。对于k=3的玩具示例,您的代码返回一个344x1矩阵,而您显式地将其初始化为一个7³x1(343x1)矩阵。

您可以使用-

针对
k=7的快速运行时测试

-------------------- With Original Approach
Elapsed time is 1.519023 seconds.
-------------------- With Proposed Approach
Elapsed time is 0.279547 seconds.

或其他矢量化方法(直接矩阵乘法):

比著名的
bsxfun
;-)快一点点


dec2base怎么样?除了你得到的非常好的答案外,你还可以选择。它也应该很快。@LuisMendo,当我看到这个问题时,我直接去你的
comb
解决方案,看看它是否能解决这个问题。只有当我开始重做你的输入单元阵列时,我才意识到简单的矩阵乘法可以直接完成这项工作。无论如何,我应该提到你的文章,它经常很有用,所以有参考文献是很好的。@Hoki是的,如果可能的话,矩阵乘法总是一种快速的方法。我的回答比较笼统,但在这种情况下可能较慢。谢谢你的评论!很好地使用了
bsxfun
,但在这种情况下不需要它。
-------------------- With Original Approach
Elapsed time is 1.519023 seconds.
-------------------- With Proposed Approach
Elapsed time is 0.279547 seconds.
msgValue = floor( mod( (0:7^k).' * (1./(7.^(0:k-1))),7 ) ) ;
%// For 10000 iterations, k=3
Elapsed time is 2.280774 seconds. %// double loop
Elapsed time is 1.329179 seconds. %// bsxfun
Elapsed time is 0.958945 seconds. %// matrix multiplication