我在列向量中有一个数字列表。在这些数字中,我有一个字母M,它以随机的间隔出现..
此链接How to delete zero components in a vector in Matlab? 显示如何删除零,我试图适应如何删除M,但徒劳。!
如何将此M替换为0? 我试过这段代码,但无济于事。!
我调用了所有样本数据N。
N = [4.6 6.7 4.1 3.1 中号 2.6]
N(N == M)= []; 我也试过这段代码 样本= N(N〜= M);
我的真实数据是从文本文件中加载的:
filename='x.txt';
N=importdata(filename)
答案 0 :(得分:3)
问题是M
项永远不会被importdata
导入!
importdata
是用于复杂数据的错误函数。如果你把它放在x.txt
:
4.6
6.7
4.1
3.1
中号
2.6
然后N=importdata(filename)
的输出只是前四个值。它无法处理M
。您应该注意到这一点,因为N
的大小应该小于文件中的值。
相反,请使用textscan
,告诉它M
是无效的项目,应该替换为0:
fid = fopen('x.text');
N = textscan(fid,'%f','treatAsEmpty',{'M'},'EmptyValue',0);
fclose(fid);
N{1}
ans =
4.6000
6.7000
4.1000
3.1000
0
2.6000
补充说明:将0
置于this value was bad
的位置可能是一个坏主意,因为它会影响您从其他函数获得的结果。我会将EmptyValue
改为NaN
。
答案 1 :(得分:2)
假设您没有数字,但数字为字符串。这意味着您可以使用函数strrep
。
尝试:
A = ['1 2 3 4 M 6'];
strrep(A,'M', '0');
答案 2 :(得分:1)
嘿,很遗憾你没有提供你在N中有什么样的数据类型。由OP double
给出的没有意义,因为就我所知,M不是一个有效的双值。
所以我假设你有一个包含在单元格中放置双打或字符串的单元格数组。如果是这样,这段代码就可以了:
N={ 1 2 2 42 5 12 'M' 'm' 123}
alphabet=['A':'Z','a':'z'];
for k=1:numel(N)
if ismember(N{k},alphabet)
N{k}=0;
end
end
display(N)
导致以下控制台输出: 输入
N =
[1] [2] [2] [42] [5] [12] 'M' 'm' [123]
输出
N =
[1] [2] [2] [42] [5] [12] [0] [0] [123]
您可以在if语句中更改替换内容。
可以修改代码以使字符串适合作为输入:
N=['1 2 2 42 5 12 M m 123']
alphabet=['A':'Z','a':'z'];
for k=1:numel(N)
if ismember(N(k),alphabet)
N(k)='0';
end
end
display(N)