如何在Matlab中从数字列表中删除字母表?

如何在Matlab中从数字列表中删除字母表?,matlab,matlab-guide,Matlab,Matlab Guide,我有一个列向量中的数字列表。在这些数字中,我有一个字母M,它以随机间隔出现 此链接 显示如何删除零,我试图适应如何删除M,但徒劳 如何将此M替换为0? 我试过这个代码,但没有用 我把我所有的样本数据都称为N N=[4.6 6.7 4.1 3.1 M 2.6] N(N==M)=[]; 我也试过这个代码 样品=N(N~=M) 我的真实数据是从文本文件加载的: filename='x.txt'; N=importdata(filename) 假设您没有真正的数字,但数字是一个字符串。这意味着您可以

我有一个列向量中的数字列表。在这些数字中,我有一个字母M,它以随机间隔出现

此链接 显示如何删除零,我试图适应如何删除M,但徒劳

如何将此M替换为0? 我试过这个代码,但没有用

我把我所有的样本数据都称为N

N=[4.6 6.7 4.1 3.1 M 2.6]

N(N==M)=[]; 我也试过这个代码 样品=N(N~=M)

我的真实数据是从文本文件加载的:

filename='x.txt'; 
N=importdata(filename)

假设您没有真正的数字,但数字是一个字符串。这意味着您可以使用函数
strep

尝试:


嘿,不幸的是,您没有提供N中的数据类型。正如OP
double
所给出的那样,没有意义,因为据我所知,M不是有效的double值

所以我假设有一个单元格数组,其中包含放置在单元格中的双精度或字符串。如果是这样,则此代码有效:

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]    [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)

问题是,您的
M
项目从一开始就不会被
importdata
导入

importdata
是用于复杂数据的错误函数。如果将其放入
x.txt

4.6
6.7
4.1
3.1
M
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
放在您的意思是
的地方可能不是一个好主意,因为它会影响从其他函数获得的结果。我会将
EmptyValue
改为
NaN

请发布示例数据。0是可接受的输入吗?是负数吗?那楠呢?嗨。没有负数,是的,我想要零来代替M。。THNAKSW什么是“字母表”
M
?一个号码?数字的行向量?请给出一个更具体的例子来定义
M
我个人怀疑
importdata
是否能够正确导入您的文本文件。检查数据的大小与预期大小。警告:输入必须是字符串的字符数组或单元格数组。它不工作..filename='x.txt';N=导入数据(文件名);strrep(N,'M,'0');x是一个文本文件,其中包含一组数字和随机位置的M…好的,但数据的类型是什么。您可以尝试运行
class(N)
我可以想象的唯一发生此错误的方法是如果x.txt是空文本文件或仅包含数字。。。这将导致该错误,因为N将是一个双精度(空或非),其他明智的N应该是字符串的单元格数组或字符串(字符数组),这取决于txt文件是否有多行。。这样的代码应该可以工作..sample=N(N~=M);我只是想从我的样本中删除M。。。然后用zero替换它。我尝试了这个方法,而
for
循环给我一个错误:
错误:无效的查找调用。
请记住,我在GNU Octave 3.8版上尝试过它。1@kkuilla嗯,奇怪的是,我在发布这两个代码之前都试过了,它们对我有用。不确定是因为你的系统还是出了什么问题。你是对的。。但是现在我必须在N pd=fitdist(N,'weibull')上运行我的weibull。。当我运行你输入的代码时,它不起作用。。它仅在导入数据时起作用。
textscan
生成单元格数组。Do
N=N{1}并且它可能会工作。然后,请返回并阅读有关数据类型的MATLAB帮助,因为如果您不花时间理解基础知识,您将陷入更多的麻烦。它不起作用。'fid=fopen('x.txt');N=textscan(fid,'%f','treatAsEmpty',{M'},'EmptyValue',0);fclose(fid);N=N{1};pd=fitdist(N,'Weibull')'+1@Zay它确实有效。我运行了patriks和nkjt的答案,它们都有效。不幸的是,你提供的信息是不正确的。你的问题不是很明确。它没有准确地描述你试图做的事情,而且遗漏了一些重要信息。不要走错方向(也不要气馁),但我认为你需要先去做作业。这本书读得很好。请发表一个新的问题。别忘了接受并投票支持你喜欢的答案。
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)
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