如何编写一个名为kellen的MATLAB函数,它接受三个名为trs,ch1,ch2的输入参数?

时间:2015-05-25 09:32:03

标签: matlab function

问题描述:

from PIL import Image from io import BytesIO from django.core.files.base import ContentFile from resizeimage import resizeimage class SomeModel(models.Model): image = models.ImageField(upload_to=your_get_file_path_callback) def save(self, *args, **kwargs): pil_image_obj = Image.open(self.image) new_image = resizeimage.resize_width(pil_image_obj, 100) new_image_io = BytesIO() new_image.save(new_image_io, format='JPEG') temp_name = self.image.name self.image.delete(save=False) self.image.save( temp_name, content=ContentFile(new_image_io.getvalue()), save=False ) super(SomeModel, self).save(*args, **kwargs) 获取字符串的行或列向量,以及trsch1两个字符。如果ch2ch1中的任何元素匹配,那么trs的该元素将被trs替换。如果ch2不在向量中,ch1将返回为未更改。

一个简单的例子:

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

我认为ww = {‘XOXO’,’XOXO’}函数可以使这个问题更容易,但我想知道MATLAB如何在不使用strrep函数的情况下处理这个问题的基本层面。所以我请求你们不要使用strrep函数来纠正我的代码。

我是MATLAB的新手。实际上,我也是编程新手。我知道我必须先学习C语言,但我不知道为什么我要挣扎。

这是我的代码,但似乎无效。

strrep

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

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

我应该修改哪部分代码?

2 个答案:

答案 0 :(得分:2)

for i = 1:c
    if trs{i} == 'c1'
       outp = [trs 'c2'];
    else
       return
    end
end

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

这里有很多问题:

  1. '...'周围添加ch1引号,使ch1为字符串文字,而不是传递给函数的字符1的变量。删除引号。 这是您的错误的来源,尝试将4个字符的字符串与3个字符的字符串等同。
  2. 您将整个字符串trs{i}与单个字符ch1等同起来。您可以在Matlab中执行此操作,但不能在if语句中执行此操作。让我们看看您的示例输入,trs{1}'YOYO',如果我们尝试'YOYO'=='Y',我们会得到一个像[1 0 1 0]这样的逻辑向量。现在if只需要10而不是向量。
  3. 所以我建议删除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)

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

但是,您需要确保ch1ch2只有一个字符长。如果你想让trs作为字符串的单元格,就像在你的问题中那样,你可以像现在一样循环它,或者你可以看一下cellfun()函数。 / p>