我有一个大小为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 m
。 I
包含m
和1
之间所有可能的n+1
- 个整数。例如,让n=4
,m=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]
i
行I
中的索引是A
对应列中元素的B_i
中的列索引。例如,考虑i=3
,即B_3=C
。然后使用1
的{{1}}列中的元素汇总矩阵C
的列3
,而A
列2
列使用列4
中的元素{1}}的{1}}。同样,1
列A
的索引是j
列I
元素的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
答案 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