【问题标题】:How to print values stored in a cell as strings (whole words) in Matlab?如何在 Matlab 中将存储在单元格中的值打印为字符串(整个单词)?
【发布时间】:2013-03-06 22:27:13
【问题描述】:

对于

A=[100;300;1000;240]

B=cell(8,1)

我将以下结果存储在 B 中

[100]
[300]
[1000]
[240]
[100;300;240]
[100;1000]
[300;1000]
[100;300;1000]

我想打印这些以将输出显示为:

choose first
choose second
choose third
choose fourth
choose first or second or fourth
choose first or third
.
.
etc

基本上,从数组A=[100;300;1000;240] 中,我希望其中的每个值都由一个字符串 表示,并且不是一个变量。知道怎么做吗?


注意:

对于我的代码,我希望用户在数组 A 中输入自己的数字,因此 A 的长度是可变的,可以大于 4。单元格B的大小也会根据公式而变化,因此并不总是固定为8。


我也很欣赏一个简单的代码,不要太复杂(除非必要),因为我没有 matlab 的专业知识。更简单的代码可以帮助我理解和学习。

【问题讨论】:

  • 可以做到详尽无遗。基本上你检查单元格 i 的内容是否出现在单元格 0 到 i-1 的任何地方。如果是,则返回单元格的索引。我不知道更有效的方法。稍后我会尝试编写代码。
  • @Parag 我正在尝试找到一种方法来做到这一点,但我无处可去..请有机会时去做。

标签: arrays string matlab printf


【解决方案1】:

对于映射我只会使用map object

index_to_string = containers.Map(keySet,valueSet)

在哪里

keySet = 1:20
valueSet = {'first'; 'second'; ...; 'twentieth'}

如果在打印之前A 可用,您可以使用相同的valueSet,只需将其缩减为A 的大小即可。

index_to_string = containers.Map(A,valueSet(1:length(A)))

例子:

G = cell(size(B))
for i = 1:length(B)
    out1 = 'choose ';
    if len(B{i}) == 1
        out1 = [out1, index_to_string(B{i})];
    else
        temp = B{i}
        for j=1:(length(temp)-1)
            out1 = [out1, index_to_string(temp(j)), ' or ' ];
        end
        out1 = [out1, index_to_string(temp(end))];
    end
    G{i} = out1
end

【讨论】:

  • @NLed 请尝试与试图帮助您的人交流。 “我不能让它工作”不是。请解释你做了什么,错误是什么,等等。另一件事:试着写下你想要发生的事件的顺序和背后的逻辑。示例:我希望用户将数字放入 A,然后我计算 B,然后我想为 B 的每一行打印 B 中的数字在矩阵 A 中的位置。以漂亮的形式。是这样吗?
  • 哦,我的错,我以为我发布了错误,我得到:Error using containers.Map The number of keys and values must be the same. .. 我的例子:keySet = 1:4valueSet = ['first', 'second','third','fourth']
  • 可能是我忘记了什么:你可能需要一个元胞数组:valueSet = 'first', 'second','third','fourth'}。我认为我之前建议的只是连接字符串,结果是一个长字符串而不是数组 os 字符串。将更新答案。
  • 您能粘贴size(valueSet) 返回的内容吗?抱歉 - 上一条评论中有错字 - 正确的行应该是 `valueSet = {'first', 'second','third','fourth'}
  • 是的,我试过了,得到了 ans = 1 22 和 size(keySet) :ans = 1 4 -- 它计算的是每个字母而不是整个字符串...
【解决方案2】:

这就是我的做法

function IChooseYouPikachu(Choices, Results)
% put in A for choices and B for results

%simple boolean to indicate whether a choice has been made already
answerChosen = 0;

for k = 1:length(Results)
    Response = 'choose';
    for m =  1:length(Choices)
        if any(Results{k} == Choices(m))
            if answerChosen
                Response = [Response ' or ' NumToOrd(m)];
            else
                answerChosen = 1;
                Response = [Response ' ' NumToOrd(m)];
            end
        end
    end
    fprintf('%s\n',Response);
    answerChosen = 0;
end

function ordinal = NumToOrd(number)
switch number
    case 1, ordinal = 'first';
    case 2, ordinal = 'second';
    case 3, ordinal = 'third';
    case 4, ordinal = 'fourth';
    otherwise, ordinal = 'out of index';
end

【讨论】:

  • 我收到一个错误,上面写着Undefined function 'NumToOrd' for input arguments of type 'double'. 另外,你能不能把它作为一个函数,我更喜欢让它在不需要函数的情况下运行。
【解决方案3】:

此答案完全基于JaredS's 答案。我刚刚澄清了你的疑问。

把它写在某个 m 文件中。

Choices=A; Results=B;
%simple boolean to indicate whether a choice has been made already
answerChosen = 0;

for k = 1:length(Results)
    Response = 'choose';
    for m =  1:length(Choices)
        if any(Results{k} == Choices(m))
            if answerChosen
                Response = [Response ' or ' NumToOrd(m)];
            else
                answerChosen = 1;
                Response = [Response ' ' NumToOrd(m)];
            end
        end
    end
    fprintf('%s\n',Response);
    answerChosen = 0;
 end

请把下面的函数写在一个单独的文件中,并把它和前面的m文件放在同一个目录下。然后你应该得到一个错误提示:"Undefined function 'NumToOrd' for input arguments of type 'double'."

function ordinal = NumToOrd(number)
switch number
    case 1, ordinal = 'first';
    case 2, ordinal = 'second';
    case 3, ordinal = 'third';
    case 4, ordinal = 'fourth';
    otherwise, ordinal = 'out of index';
end

【讨论】:

  • 我得到的结果是choose ,后面是空白..是什么原因造成的?
  • 这对我来说很难说,因为这不是我的代码。但我可以肯定地建议你一件事。学习调试。所以一步一步地进入你的程序,你会发现为什么会这样。将来也会对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
相关资源
最近更新 更多