【问题标题】:How can I write a MATLAB function named kellen that takes three input arguments named trs, ch1,ch2?如何编写一个名为 kellen 的 MATLAB 函数,它接受三个名为 trs、ch1、ch2 的输入参数?
【发布时间】:2015-05-25 09:32:03
【问题描述】:

问题描述:

trs 接受字符串的行或列向量,两个字符为ch1ch2。如果ch1trs 中的任何元素匹配,则trs 的该元素将被ch2 替换。如果ch1 不在向量中,trs 将原样返回。

一个简单的例子:

输入:ww = kellen({‘YOYO’, ‘YOYO’},’Y’,’X’),
输出:ww = {‘XOXO’,’XOXO’}

我假设strrep 函数可以使这个问题变得更容易,但我想知道 MATLAB 如何在不使用strrep 函数的情况下处理这个问题的最基本水平。所以我请求你们在不使用strrepfunction 的情况下更正我的代码。

我是 MATLAB 新手。确实,我也是编程新手。我知道我必须先学习 C 基础知识,但我不知道为什么我要努力。

这是我的代码,但它似乎不起作用。

function ww = kellen(trs,ch1,ch2)


[r c] = size(trs);
if r == 1 && c > 1
   for i = 1:c
       ind = trs{i} == ch1;
       trs{1,i}(ind==1) = ch2;
       ww = trs;
   end
if r == 1 && c ==1
   for i = 1:c
       ind = trs{i} == ch1;
       trs{1,i}(ind==1) = ch2;
       ww = trs
   end
end

当字符串向量的大小为行向量时,我的代码工作正常,但当我传递 trs 字符串的标量时,我的函数工作不正常。例如:

kellen({ 'peter piper picked a peck of pickled peppers' }, 'p', 'b')

我应该修改代码的哪一部分?

【问题讨论】:

  • 请详细解释什么“似乎不起作用”,它是错误的还是只是产生了错误的输出?如果是后者,请准确解释输出有什么问题
  • >> ww = kellen({'YOYO', 'YOYO'},'Y','X') 错误使用 == 矩阵尺寸必须一致。如果 trs{i} == 'ch1' 出现 kellen 错误(第 7 行)
  • 您的输出变量是ww,它被设置为trs 的副本。它没有在其他任何地方修改,因此除非失败,否则它将返回未修改的输入。
  • 感谢 xenoclast 的提示
  • 您的if 声明完全没有必要。为什么要以不同方式处理标量或行向量?没有必要。你也错过了end

标签: matlab function


【解决方案1】:
for i = 1:c
    if trs{i} == 'c1'
       outp = [trs 'c2'];
    else
       return
    end
end

我在您的代码中看到的第一个问题是:if trs{i} == 'c1'

这里有很多问题:

  1. 通过在ch1 周围加上'...' 引号,您使ch1 成为字符串文字,而不是传递给您的函数的第一个字符的变量。去掉引号。 这是您的错误的根源,试图将 4 个字符的字符串等同于 3 个字符的字符串。
  2. 您将整个字符串 trs{i} 等同于单个字符 ch1。您可以在 Matlab 中执行此操作,但不能在 if 语句中执行此操作。让我们以您的示例输入为例,trs{1}'YOYO',如果我们尝试'YOYO'=='Y',我们会得到一个类似于 [1 0 1 0] 的逻辑向量。现在 if 只需要 10 而不是向量。

所以我建议删除 if 语句并改用 Matlab 的逻辑索引:

outp{c} = [];  %// this is just preallocation
for i = 1:c
    temp = trs{i};
    idx = temp==ch1 %// Get a logical matrix of which characters match
    temp(idx)=ch2; %// Use logical indexing to replace all the characters that match in this string in one go!
    outp{i} = temp;
end

一旦你理解了这段代码,你就可以简化:

outp = trs;
for i = 1:c
    outp{i}(outp{i}==ch1)=ch2
end

【讨论】:

  • 谢谢丹。所以我想我应该基于逻辑向量 [1 0 1 0] 工作。不是吗?
  • 嗯,丹,我稍微修改了我的代码,我认为我离它更近了一点,但一项重要的工作还没有完成。那就是我的代码不会用ch2替换字符串中匹配的元素。这是一个输入: ww = kellen({'YOYO', 'YOYO'},'Y','X') 我得到这样的输出: ww = 'YOYO' 'YOYO' 。请帮忙。
  • @novicecoder 我添加了一个可能的解决方案供您探索。
  • 谢谢丹。您的代码运行良好,似乎您处于专业水平。由于我是新手,所以我认为我应该提出解决方案。我提出了一个解决方案,但遇到了问题,我只是根据我的解决方案编辑了我的问题。我的解决方案不适用于 trs 的标量类型,但它适用于 trs 的行向量。请给我有关错误的线索。谢谢。
【解决方案2】:

您可以使用ismember() 查找ch1trs 中存在的位置。所以,实际上trs(ismember(trs,ch1)) = ch2; 将用trs 中的ch2 替换所有ch1 实例。

但是,您需要确保ch1ch2 的长度正好是一个字符。如果您想将trs 作为字符串单元格,就像在您的问题中一样,您可以按照现在的方式循环遍历它,或者您可以查看cellfun() 函数。

【讨论】:

  • 如果ch1 等只是一个字符,那么您可以使用== 而不是ismember...
  • 谢谢塔马斯的提示。
猜你喜欢
  • 2022-11-20
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多