对4个Matlab数组的所有可能行求和
假设我有四个Matlab数组对4个Matlab数组的所有可能行求和,matlab,Matlab,假设我有四个Matlab数组A_1,A_2,A_3,A_4,每个维度mxn,其中m可能很大。这些矩阵包含严格的正数 clear rng default m=4; n=500; A_1=betarnd(1,2,m,n); A_2=betarnd(1,2,m,n); A_3=betarnd(1,2,m,n); A_4=betarnd(1,2,m,n); 我想用文字做什么: 我想构造一个维度为bx4的矩阵B,以便B的每一行都报告 索引[i,j,k,h]如果 A_1(i,1)+A_2(j,1)+A_
A_1
,A_2
,A_3
,A_4
,每个维度mxn
,其中m
可能很大。这些矩阵包含严格的正数
clear
rng default
m=4;
n=500;
A_1=betarnd(1,2,m,n);
A_2=betarnd(1,2,m,n);
A_3=betarnd(1,2,m,n);
A_4=betarnd(1,2,m,n);
我想用文字做什么: 我想构造一个维度为
bx4
的矩阵B
,以便B
的每一行都报告
索引[i,j,k,h]
如果
A_1(i,1)+A_2(j,1)+A_3(k,1)+A_4(h,1)就像链接答案一样,你可以在每一步预计算矩阵。结果是可以转换为下标的逻辑m^4
矩阵:
lhs4=A_4(:,1)-A_4(:,2:end);
lhs1=A_1(:,1)-A_1(:,2:end);
lhs2=A_2(:,1)-A_2(:,2:end);
rhs3=A_3(:,2:end)-A_3(:,1);
Q = .95 * (n - 1);
check = false (m,m,m,m);
for i=1:m
lhsi = lhs4 + lhs1(i,:);
for j=1:m
lhsj = lhsi + lhs2(j,:);
for k=1:m
rhsk = rhs3(k,:);
check(:,k,j,i) = sum (lhsj > rhsk , 2) < Q;
end
end
end
f = find (check);
[H,K,J,I] = ind2sub ([m m m m], f) ;
lhs4=A_4(:,1)-A_4(:,2:end);
lhs1=A_1(:,1)-A_1(:,2:end);
lhs2=a2(:,1)-a2(:,2:end);
rhs3=A_3(:,2:end)-A_3(:,1);
Q=.95*(n-1);
检查=假(m,m,m,m);
对于i=1:m
lhsi=lhs4+lhs1(i,:);
对于j=1:m
lhsj=lhsi+lhs2(j,:);
对于k=1:m
rhsk=rhs3(k,:);
校验(:,k,j,i)=和(lhsj>rhsk,2)
你的意思可能是分位数(A_1(i,2:end)+A_2(j,2:end)+A_3(k,2:end)+A_4(h,2:end),0.95)
?是的,谢谢。请注意,如果像链接的问题一样,m
的值是10^5
并且数据的%95与条件匹配,并且您希望存储不匹配的情况的索引(即剩余的%5)与int32一样,您需要接近17.3的内存。10^20超出了uint64的索引范围。我知道,m太大了。我确实需要使用更小的数组,但我仍然需要一个高效的代码。
lhs4=A_4(:,1)-A_4(:,2:end);
lhs1=A_1(:,1)-A_1(:,2:end);
lhs2=A_2(:,1)-A_2(:,2:end);
rhs3=A_3(:,2:end)-A_3(:,1);
Q = .95 * (n - 1);
check = false (m,m,m,m);
for i=1:m
lhsi = lhs4 + lhs1(i,:);
for j=1:m
lhsj = lhsi + lhs2(j,:);
for k=1:m
rhsk = rhs3(k,:);
check(:,k,j,i) = sum (lhsj > rhsk , 2) < Q;
end
end
end
f = find (check);
[H,K,J,I] = ind2sub ([m m m m], f) ;