【问题标题】:Summing across all possible rows of 4 Matlab arrays对 4 个 Matlab 数组的所有可能行求和
【发布时间】:2020-10-08 20:56:56
【问题描述】:

假设我有四个 Matlab 数组 A_1A_2A_3A_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)<=quantile(A_1(i,2:end)+A_2(j,2:end)+A_3(k,2:end),A_4(h,2:end) 0.95)

对于从1m 的每个i,j,k,h

注意b 最多可以是m^4


我想做的可以通过循环i,j,k,h来实现。但是,我需要处理一个大的m。因此,我希望您能帮助我构建一个非常高效的代码,这反过来又可以帮助我了解我可以将m 推到多远。


这个答案here 非常有帮助,尽管它解决了一个稍微不同的问题。下面,我正在尝试针对我的具体情况重新调整它。可以改进吗?另外,我不知道如何在B 中正确存储索引。

lhs4=A_4(:,1)-A_4(:,2:end); %mx(n-1)
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);
h_all=(1:1:m).';

for i=1:m
    for j=1:m
        LHS=lhs4+lhs1(i,:)+lhs2(j,:); %mx(n-1)
        for k=1:m
            h=h_all.*(sum(LHS>rhs3(k,:),2)<Q); %mx1
            h(h==0)=[]; %delete the zeros
            %HOW DO I STORE {i,j,k,h}?
        end
    end
end

【问题讨论】:

  • 你的意思是quantile(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 exabytes 的内存。并且 10^20 超出了 uint64 索引范围。
  • 我知道,m 太大了。我确实需要使用更小的数组,但我仍然需要高效的代码。

标签: matlab


【解决方案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) ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2022-01-14
    相关资源
    最近更新 更多