对4个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_

假设我有四个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_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) ;