MATLAB - 如何使用上一次操作的索引查找另一列的值?

MATLAB - How do I find another column's values with the indices from a previous operation?

提问人:Benvz 提问时间:10/27/2023 更新时间:10/27/2023 访问量:44

问:

我目前正在尝试从 273614x25 矩阵中制作一个具有吸收线位置和前 N 个最强线强度的小矩阵。但是,我只需要 Wavenumber 的 2045-2155 范围内的相应值,该值是矩阵中的列。

到目前为止,降低指数和范围的工作非常顺利。但是我尝试制作一个小的 for 循环,它从第 1 列开始获取这些索引和范围,并尝试分配前 N 个最高值的索引。

我只需要一个 Nx2 矩阵,其中第 1 列具有波数,第二列具有前 N 线强度及其相应的波数。

到目前为止,我有这个:

A = readmatrix("linelist_H216O.txt");
RangeMin = 2045;
RangeMax = 2155;
MinInd = find(A(:,1)>RangeMin,1);
MaxInd = find(A(:,1)>=RangeMax,1);
B = A(RangeMin:RangeMax,5);
L = maxk(B, 20, 1);
IND = zeros(length(L),1);

for i = 1:length(L)  
    IND(i) = find(A(MinInd:MaxInd,5)==L(i,:),1);
end 

TopLines = [IND+MinInd, L];

但问题出在第 11 行,它说双方都有不同数量的元素。 有谁知道如何解决这个问题?

数组 MATLAB FOR 循环 矩阵

评论

0赞 Benvz 10/27/2023
我似乎无法上传文本文件,但我不确定这是否有必要。
0赞 Wolfie 10/27/2023
如果你想成为上限,大概应该使用?你可以做一些事情,比如过滤掉满足你条件的行。如果这是不正确的,那么编辑你的问题并用一个最小的可重现示例替换你的代码片段对你来说是最有帮助的,即创建一个小例子,我们可以用代表你的真实数据的预期输入/输出来测试,这样我们就可以运行它。MaxInd = find(A(:,1)>=RangeMax,1);<=RangeMaxidx = (A(:,1)>RangeMin) & (A(:,1)<=RangeMax); B = A(idx,:);
0赞 Benvz 10/27/2023
A = readmatrix("linelist_H216O.txt"); %Loads H20 Linelist RangeMin = 2045; %Minimum Wavenumber RangeMax = 2155; %Maximum Wavenumber MinInd = find(A(:,1)>RangeMin,1); %Index of Min WN MaxInd = find(A(:,1)>=RangeMax,1); %Index of Max WN B = A(MinInd:MaxInd, [1, 5]); %Column 1 and 5 of A (WN and Linestrengths (S)) within range C = [1:25]'; %Numbers [L,I] = maxk(B(:,2), 25, 1); %Get indices of 20 highest S E = [C, B(I,:)]; %WN and respective S in order
0赞 Benvz 10/27/2023
设法以完全不同的方式修复它!

答:

0赞 Benvz 10/27/2023 #1

我设法做到了:

A = readmatrix("linelist_H216O.txt");   %Loads H20 Linelist
RangeMin = 2045;                        %Minimum Wavenumber
RangeMax = 2155;                        %Maximum Wavenumber
MinInd = find(A(:,1)>RangeMin,1);       %Index of Min WN
MaxInd = find(A(:,1)>=RangeMax,1);      %Index of Max WN
B = A(MinInd:MaxInd, [1, 5]);           %Column 1 and 5 of A (WN and Linestrengths (S)) within range
C = [1:25]';                            %Numbers
[L,I] = maxk(B(:,2), 25, 1);            %Get indices of 25 highest S
E = [C, B(I,:)];                        %WN and respective S in order