我正在研究一个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
第二列值将从2
到1500
。我想要做的是在第二列为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
答案 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