MATLAB:使用小矩阵的元素有效构造大型矩阵

时间:2014-08-31 14:54:28

标签: matlab matrix vectorization

我有一个大小为A x (n+1)(n+1) = n的小矩阵O(10)。我需要构建N=(n+1)^m更大的矩阵B_i,每个矩阵N x m,其中m = O(10)。幸运的是,我当时只需要存储一个B_i,因此内存不是问题。为了生成每个B_i,我有一个矩阵I的索引,大小为N x mI包含m1之间所有可能的n+1 - 个整数。例如,让n=4m=4,然后

I=[1 1 1 1; 
   2 1 1 1; 
   3 1 1 1; 
   4 1 1 1; 
   5 1 1 1; 
   1 2 1 1; 
       .
       .
   5 5 5 5] 

iI中的索引是A对应列中元素的B_i中的列索引。例如,考虑i=3,即B_3=C。然后使用1的{​​{1}}列中的元素汇总矩阵C的列3,而A2列使用列4中的元素{1}}的{​​1}}。同样,1A的索引是jI元素的A中的行索引。再考虑j

B_i

等等。使用double for循环构建每个B_3=C是微不足道的。但是,由于我必须构建C(1,1) = A(1,3) C(2,1) = A(2,3) C(3,1) = A(3,3) C(4,1) = A(4,3) C(5,1) = A(5,3) C(6,1) = A(1,3) . . C(N,1) = A(5,3) C(1,2) = A(1,1) C(2,2) = A(1,1) C(3,2) = A(1,1) C(4,2) = A(1,1) C(5,2) = A(1,1) C(6,2) = A(2,1) . . C(N,2) = A(5,1) B_i,因此生成的三N循环将永远存在。你能告诉我一些聪明的MATLAB技巧来快速构建这些矩阵吗?

顺便说一句,我真的不需要B_i,而只需要他们列的元素乘积,即

for

这是B_i x PolyMD=prod(C,2) 列向量。正如我之前所说,我一次只存储一个N,因此首先计算1然后再计算B_i不是一个大问题。不过,如果有一种快速而简单的直接获取B_i的方法,我很想知道。非常感谢和问候,

塞尔吉奥

编辑:这是一个完整的例子,希望能让问题更加清晰。

PolyMD

1 个答案:

答案 0 :(得分:2)

也许这就是你想要的:

n = 4;
m = 4;
N = (n+1)^m;
A = rand(n+1,n+1); %// example data
I = fliplr(dec2base(0:(n+1)^m-1,n+1)-'0'+1); %// combinations of column indices
for ii = 1:N %// it's better not to use "i" as a variable name
    B_i = A(bsxfun(@plus, I, (I(ii,:)-1)*(n+1))); %// linear indexing into A
    result_i = prod(B_i,2); %// "Poly" is a reserved word. Better not use it.
end