How can I selectively import data from two matrices into a third?
1 回表示 (過去 30 日間)
古いコメントを表示
I have two matrices, one of them real data and one of them theoretical data. I want to go through the real data in the first column of the matrix and match it to the theoretical data, also in the first column of the matrix.. When they match, I want to put both columns of the real data and the second and third columns of the theoretical data into a new matrix, called combined_data. An issue between the two matrices is that there can be multiple matches in the theoretical data. If there is multiple matches for a point, I want the match with the lowest sum of the corresponding second and third column entries for that row. I know this probably includes a for loop and some if statements, but I'm not sure where to start. Some sample matrices look like this:
real_data= 126.75 980
240.50 1020
241 300
theoretical_data= 126.8 0 1
126.8 0 2
240.5 1 1
243 1 2
So the combined_data matrix would look like this
126.75 980 0 1
240.50 1020 1 1
241 300 1 1
0 件のコメント
回答 (1 件)
rakshit gupta
2023 年 6 月 7 日
編集済み: rakshit gupta
2023 年 6 月 9 日
You can refer to the the code below:
% Define the real and theoretical data tables
real_data = [126.75, 980;
240.50, 1020;
241, 300];
theoretical_data = [126.8, 0, 1;
126.8, 0, 2;
240.5, 1, 1;
243, 1, 2];
% Initialize the combined_data matrix and a flag to mark used theoretical data
combined_data = zeros(0, size(real_data, 2) + size(theoretical_data, 2) - 1);
n_theoretical_pts = size(theoretical_data, 1);
theory_used = zeros(n_theoretical_pts, 1);
% Loop through each row of the real data
for i = 1:size(real_data, 1)
% Compute the difference between real and theoretical data's first column
diff = theoretical_data(:, 1) - real_data(i, 1);
% Find the index of the minimum difference
[min_diff, idx] = min(abs(diff));
% Check if the corresponding theoretical data point has already been used
while theory_used(idx) % while true
% Replace the used point's value in the difference vector with Inf to ignore it
diff(idx) = Inf;
% Find the new minimum difference and its index
[min_diff, idx] = min(abs(diff));
end
% Mark the theoretical data point as used
theory_used(idx) = 1;
% Extract the matched data
real_entry = real_data(i, :);
theory_entry = theoretical_data(idx, 2:end);
% Append the matched data to the combined_data matrix
combined_entry = [real_entry, theory_entry];
combined_data = [combined_data; combined_entry];
end
% Display the resulting combined_data matrix
disp(combined_data);
2 件のコメント
rakshit gupta
2023 年 6 月 7 日
Another way to ignore it is by setting diff(idx) to NaN instead of infinity. The code seems to be working in R2023a.
%replace inf by NaN
diff(idx) = NaN
参考
カテゴリ
Help Center および File Exchange で Loops and Conditional Statements についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!