根据特定列

时间:2018-02-15 10:06:16

标签: matlab search indexing row

我正在研究一个4x4矩阵的数据。这个矩阵的样本如下所示:

2361.31888  2   3   0.03848284
2351.31888  2   3   0.03828271
2341.31888  2   3   0.03583279
2331.31888  2   3   0.03613991
2511.31888  3   3   0.09945525
2501.31888  3   3   0.10257245
2491.31888  3   3   0.08145624

第二列值将从21500。我想要做的是在第二列为2时提取第一列和第四列值,直到第二列达到1500为止。

例如,当第二列为2时我需要这些行,并且想要计算该子矩阵的线性回归。这也应该对原始矩阵的其余部分进行。

    2361.31888  0.03848284
    2351.31888  0.03828271
    2341.31888  0.03583279
    2331.31888  0.03613991

计算提取列的线性回归。我写了这样的代码,但它无法正常工作。

for i = unique(D(:,2))'
    if D(:,2)==i        
        X(i) = D(:,1) ;
        Y(i) = D(:,4) ;
        n = numel(X(i));

        % // Define relevant quantities for finding quantities
        sumxi = sum(X(i));
        sumyi = sum(Y(i));
        sumxiyi = sum(X(i).*Y(i));
        sumxi2 = sum(X(i).^2);
        sumyi2 = sum(Y(i).^2);

        %// Determine slope and intercept
        m(i) = (sumxi * sumyi - n*sumxiyi) / (sumxi^2 - n*sumxi2);
        b(i) = (sumxiyi * sumxi - sumyi* sumxi2) / (sumxi^2 - n*sumxi2);
    end
end

2 个答案:

答案 0 :(得分:2)

要根据矩阵中的列值提取行,您可以使用数组索引中的逻辑

>> D = [ 2361.31888  2   3   0.03848284; ...
         2351.31888  2   3   0.03828271; ...
         2341.31888  2   3   0.03583279; ...
         2331.31888  2   3   0.03613991; ...
         2511.31888  4   3   0.09945525; ...
         2501.31888  4   3   0.10257245; ... 
         2491.31888  4   3   0.08145624 ];

>> indexes_where_2nd_col_is_2 = ( D(:,2) == 2 )

indexes_where_2nd_col_is_2 =

  7×1 logical array

   1
   1
   1
   1
   0
   0
   0

>> D(indexes_where_2nd_col_is_2, :)

ans =

   2361.31888  2   3   0.03848284
   2351.31888  2   3   0.03828271
   2341.31888  2   3   0.03583279
   2331.31888  2   3   0.03613991

要在循环中完成此工作,您可以执行类似

的操作
for i = unique(D(:,2))'
    M = D(D(:,2) == i, :);
    X(i) = M(:,1);
    Y(i) = M(:,4);

    % Rest of your code...
end

答案 1 :(得分:-1)

您可以通过识别起始值(2)和结束值(1500)的出现指数来提取感兴趣的两列:

然后,您可以使用函数unique在第二列中查找唯一值。

如果您致电unique询问三个输出值,您将获得唯一值集合的出现指数

此时,您可以循环遍历这些索引以提取单个子数据集。

以下代码摘录:

  • sub_m:整个子矩阵,第二列的值在2到1500之间 - first_column:仅第一列的数据
  • fourth_column:第四栏的数据
  • sub_data:一个结构数组,其字段为:unique_values第2列中的唯一值first_column:第一列的数据对应于唯一值{{1 }:与唯一val
  • 对应的第四列数据

测试目的代码我修改了原始矩阵:

fourth_column

输出:

m_data=[
2361.31888    2   3   0.03848284
2351.31888    2   3   0.03828271
2341.31888    2   3   0.03583279
2331.31888    2   3   0.03613991
2511.31888    3   3   0.09945525
2501.31888    3   3   0.10257245
2491.31888    4   3   0.08145624
2491.31888    4   3   0.08145624
2491.31888    4   3   0.08145624
1234.31888 1500   3  13.08145624
5678.31888 1500   3  33.08145624
];

% Define the desired initial value
initial_val=2;
% Define the desired final value
final_val=1500;
% FInd the indices of the data in the second column equal to the initial value
idx_1=find(m_data(:,2) == initial_val)
% FInd the indices of the data in the second column equal to the final value
idx_2=find(m_data(:,2) == final_val)
% The start index is the first element of the set
start_idx=idx_1(1)
% The final index is the index of hte first occurrence of the final value -1
final_idx=idx_2(1)-1
% The whole sub matrix is:
sub_m=m_data(start_idx:final_idx,:)
% The second column of the sub matrix is:
first_column=m_data(start_idx:final_idx,1)
% The fourth column of the sub matrix is:
fourth_column=m_data(start_idx:final_idx,4)
% Get the unique values
[unique_values,a,b]=unique(m_data(start_idx:final_idx,2))
% Esxtract the set of data for the unique values
sub_data(1).val=unique_values(1)
sub_data(1).first_column=first_column(1:a(1))
sub_data(1).fourth_column=fourth_column(1:a(1))
for i=2:length(unique_values)
   sub_data(i).val=unique_values(i)
   sub_data(i).first_column=first_column(a(i-1)+1:a(i))
   sub_data(i).fourth_column=fourth_column(a(i-1)+1:a(i))
end