How to add tolerance to my code ?

10 ビュー (過去 30 日間)
Faez Alkadi
Faez Alkadi 2017 年 9 月 22 日
コメント済み: Faez Alkadi 2017 年 9 月 26 日
I have this code to flipud every other line along x-axis. The code works (only) when the increment on x-axis is an integer number(1,2,3...or 4 etc) as in data (a) attached, result shown in the first figure for 2 increment . but when the increment on x-axis is a fraction(1.123 or 1.234, ...or etc) as in data (b) attached, it only work for the first line as shown in the second Figure for 1.123 increment.
I think the reason is that I need to add a tolerance to the result of desired_line so Matlab can find it and add it to the desired_line_matrix. because of precision issue.
_ But i don't know how to add the tolerance of search !!!!_
Thank you so much
%Find the desired lime:
desired_line_matrix=[];
TS=2;
s=a;
desired_line=[];
line_number=(max(s(:,1))-min(s(:,1)))/TS;
for j=0:TS:line_number*2
desired_line =s(1,1)+(j+min(s(:,1)));
desired_line_matrix=[desired_line_matrix,desired_line];
end
%Flip the desired lime:
for i=1:length(desired_line_matrix)
[r,c]=find(s(:,1)==desired_line_matrix(i));
d=r';
s(d,:)=flipud(a(d,:));
end
plot(s(:,1),s(:,2))
xlabel('X')
ylabel('Y')
hold on

採用された回答

Image Analyst
Image Analyst 2017 年 9 月 22 日
use ismembertol(), or else
tolerance = 0.001; % whatever....
closeEnough = abs(s(:,1) - desired_line_matrix(i)) <= tolerance;
[r,c]=find(closeEnough);
  9 件のコメント
Image Analyst
Image Analyst 2017 年 9 月 26 日
Never mind. I added the code to the beginning of the file myself. It's below to help anyone else who might want to try to help you:
% Read in a.mat file, using the load() function, into a structure.
storedStructure = load('a.mat')
% Take the "s" array of the structure and copy it into a.
a = storedStructure.s;
% Read in b.mat file, using the load() function, into a structure.
storedStructure = load('b.mat')
% Take the "s" array of the structure and copy it into b.
b = storedStructure.s;
s=b;% here is the line where you set a and b NO IT'S NOT. You use b here, not SET it.
TS=1.123; % Change this to 2 for a
desired_line=[];
desired_line_matrix=[];
line_number=(max(s(:,1))-min(s(:,1)))/TS;
for j=0:TS*2:line_number*TS
desired_line =s(1,1)+(j+min(s(:,1)));
desired_line_matrix=[desired_line_matrix,desired_line];
end
for i=1:length(desired_line_matrix)
[r,c]=find(s(:,1)==desired_line_matrix(i));
d=r';
s(d,:)=flipud(s(d,:));
end
plot(s(:,1),s(:,2))
xlabel('X')
ylabel('Y')
hold on
But I'm not really sure what you want. It produces the plot you showed, but what is wrong with that? What do you mean by "it only work for the first line"? What is being plotted? One line? All lines? What would you expect it to look like? A square wave regardless of what Ts is?
Faez Alkadi
Faez Alkadi 2017 年 9 月 26 日
Hi,
First of all I would like to thank you for your effort.
What I meant by "it only work for the first line" is that it only flip upside down the first line where I wanted it to flip every other line to form square wave regardless of what TS is.
But I think using your first answer is going to work for me if i can set the right tolerance.
tolerance = 0.001; % whatever....
closeEnough = abs(s(:,1) - desired_line_matrix(i)) <= tolerance;
[r,c]=find(closeEnough);
I will work on it and see how it goes !!!
Thank you again.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by