matlab非常新,还在学习基础知识。我正在尝试编写一个脚本来计算波形中两个峰值之间的距离。我已经设法做的那部分,我已经使用xlswrite将我获得的值放到excel文件中。
对于每个文件,我有大约50-250列,只有两行:第二行有数值,第一行有列标题,从我从中提取数据的原始excel文件中复制。
某些列具有相似但不相同的标题,例如'green227RightEyereading3'和'green227RightEyereading4'等。有没有办法可以对具有相似标题的列进行分组,例如在标题(I.e.green227)和“右眼”或“左眼”中具有相同的数字/颜色,并计算其数值的平均值?链接到此处的文件:> https://www.dropbox.com/s/ezpyjr3raol31ts/SampleBatchForTesting.xls?dl=0>
>[Excel_file,PathName] = uigetfile('*.xls', 'Pick a File','C:\Users\User\Documents\Optometry\Year 3\Dissertation\A-scan3');
>[~,name,ext] = fileparts(Excel_file);
>sheet = 2;
>FullXLSfile = [PathName, Excel_file];
>[number_data,txt_data,raw_data] = xlsread(FullXLSfile,sheet);
>HowManyWide = size(txt_data);
>NumberOfTitles = HowManyWide(1,2);
>xlRangeA = txt_data;
>Chickens = {'Test'};
>for f = 1:xlRangeA; %%defined as top line of cells on sheet;
>Text = xlRangeA{f};
>HyphenLocations = find(Text == '-');
>R = HyphenLocations(1,1) -1;
>Chick = Text(1:R);
>Chick = cellstr(Chick);
>B = length(Chick);
>TF = strncmp(Chickens,Chick,B);
>if any(TF == 1); %do nothing
>else
>Chickens = {Chickens;Chick};
>end
>end
这里也是我运行整个脚本时创建的文件的链接。标题下方的值是我正在分析的组织的计算厚度。 https://www.dropbox.com/s/4p6iu9kk75ecyzl/Choroid_Thickness.xls?dl=0
非常感谢
答案 0 :(得分:1)
如果不同的字符位于标题的最末端(或最开头),则可以使用 strncmp buit-in函数并仅比较字符串的一部分。查看更多here。但请提供一些代码和excel文件的一部分。这会有所帮助。
此外,如果我没有记错,您将所有数据保存到Excel中,然后再次重新调用它以对其进行排序。也许你应该考虑只保存excel中的最终结果,它会节省你一些时间,特别是如果你想多次运行你的脚本。
编辑:
这是我提出的代码。它肯定不是最好的解决方案,但它适用于您上传的文件。我省略了不必要的行和变量。只有当每个读数的数字具有相同的数字时,代码才有效。只要每个条目有4位数,它们就可以是4位数。因为在每个文件中你都有相同颜色的波,你唯一关心的是用左眼还是右眼记录读数(正确吗?)。基于该代码和您编写的代码,比较涉及包含单词“Right”或“Left”的字符串部分,即连字符之间的字符。
[Excel_file,PathName] = uigetfile('*.xls', 'Pick a File',...
'C:\Users\User\Documents\Optometry\Year 3\Dissertation\A-scan3');
sheet = 1;
FullXLSfile = [PathName,Excel_file];
[number_data,txt_data,raw_data] = xlsread(FullXLSfile,sheet);
%% data manipulation
NumberOfTitles = length(txt_data);
TextToCompare = txt_data{1};
r1 = 1; % counter for Readings1 vector
r2 = 1; % counter for Readings2 vector
for ff = 1:NumberOfTitles % in your code xlRangeA is a cell vector not a number!
Text = txt_data{ff};
HyphenLocations = find(Text == '-');
Text = Text(HyphenLocations(1,1):HyphenLocations(1,2)); % take only the part that contains the "eye" information
TextToCompare = TextToCompare(HyphenLocations(1,1):HyphenLocations(1,2)); % same here
if (Text == TextToCompare)
Readings1(r1) = number_data(ff); % store the numerical value in a vector
r1 = r1 + 1; % increase the counter of this vector
else
Readings2(r2) = number_data(ff); % same here
r2 = r2 + 1;
end
TextToCompare = txt_data{1}; % TextToCompare re-initialized for the next comparison
end
mean_readings1 = mean(Readings1); % Find the mean of the grouped values
mean_readings2 = mean(Readings2);
我很肯定这可以通过更有效和更细致的方式完成。我不知道你想要做什么样的计算,所以我只把平均值作为例子。在if
语句中,如果需要,您还可以存储txt_data
。下面我还介绍了第二种方法,我发现它更加细腻。如果您想测试它,只需用%%data manipulation
部分替换下面的部分:
%% more delicate way
Text_Vector = char(txt_data);
TextToCompare2 = txt_data{1};
HyphenLocations2 = find(TextToCompare2 == '-');
TextToCompare2 = TextToCompare2(HyphenLocations2(1,1):HyphenLocations2(1,2));
Text_Vector = Text_Vector(:,HyphenLocations2(1,1):HyphenLocations2(1,2));
Text_Vector = cellstr(Text_Vector);
dummy = strcmpi(Text_Vector,TextToCompare2);
Readings1 = number_data(dummy);
Readings2 = number_data(~dummy);
我希望这会有所帮助。