【问题标题】:How to remove an alphabet from a list of numbers in Matlab?如何从 Matlab 中的数字列表中删除字母?
【发布时间】:2014-10-17 08:06:29
【问题描述】:

我有一个列向量中的数字列表。在这些数字中,我有一个字母 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 是可接受的条目吗?是负数吗?那 NaN 呢?
  • 嗨。没有负数,是的,我想用零来代替 M.. thnaks
  • 什么是“字母”M?一个号码?数字的行向量?请给出一个更具体的例子来定义M
  • 我个人怀疑importdata 是否能够正确导入您的文本文件。检查您的数据大小 N 与您的预期大小。

标签: matlab matlab-guide


【解决方案1】:

问题是你的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

【讨论】:

  • 你是对的.. 但是现在我必须在 N pd=fitdist(N,'Weibull') 上运行我的 weibull .. 当我运行你放置的代码时它不起作用.. 它仅在我导入数据时才起作用..
  • textscan 生成一个元胞数组。做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 的答案,它们都有效。不幸的是,您提供的信息不正确。你的问题没有很好的定义。它没有准确地描述您要做什么,并且缺少重要信息。不要采取错误的方式(也不要气馁),但我认为你需要先去做功课。 How To Ask 是一本好书。
  • 请发布一个新问题。不要忘记接受并投票您的首选答案。
【解决方案2】:

假设您实际上没有数字,而是将数字作为字符串。这意味着您可以使用函数strrep

尝试:

A = ['1 2 3 4 M 6'];
strrep(A,'M', '0');

【讨论】:

  • 警告:输入必须是字符数组或字符串元胞数组。它不起作用..
  • 文件名='x.txt'; N=导入数据(文件名); strrep(N,'M', '0');
  • x 是一个文本文件,其中包含一堆数字和随机位置的 M...
  • 好的,但是您的数据类型是什么。您可以尝试运行class(N)
  • 我可以想象发生此错误的唯一方法是,如果 x.txt 是一个空文本文件或仅包含数字...这将导致该错误,如 N一个双精度(是否为空),否则 N 应该是一个字符串元胞数组或一个字符串(字符数组),这取决于 txt 文件是否有多行
【解决方案3】:

嘿,不幸的是,您没有提供 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)

【讨论】:

  • 嗨..这样的代码应该可以工作..sample=N(N~=M);即我只是想从我的样本 N 中删除 M...并将其替换为零
  • 我试过这个,for 循环给了我一个错误:error: Invalid call to lookup. 请记住,我在 GNU Octave 版本 3.8.1 上尝试过
  • @kkuilla hm 很奇怪,我在将它们发布在这里之前尝试了这两个代码,它们对我有用。不知道是因为你的系统还是出了什么问题。
猜你喜欢
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
相关资源
最近更新 更多