matlab向数字向量的每个元素添加一个字符串

时间:2018-02-23 20:00:36

标签: string matlab concatenation

我需要在数字向量和字符串向量之间切换:

@AfterReturning(value = "(* my.java.model.Triangle.myTest*(*))  && args(param)", returning = "returnedString", argNames = "param,returnedString")
  public void afterReturningAdvice(String param, String returnedString) {
    System.out.println("Executing after function advice that accepts the input " + param + " and returns " + returnedString);
  }

我尝试a = [1, 2, 4, 5] b = {'xx1', 'xx2', 'xx3', 'xx4'} ,但它返回strcat('XX', num2str(a)),这不是我想要的。有人可以告诉我如何从XX1 2 3 4 5创建b以及如何从a创建a吗?谢谢!

4 个答案:

答案 0 :(得分:3)

无需循环或cellfun。让

a = [1, 2, 4, 15];
b = {'xx1', 'xx2', 'xx4', 'xx15'};

ba

使用格式说明符为a的{​​{3}}将'%-i'转换为字符串的单元格数组,以利用num2str忽略尾随空格的事实;并在使用后者通过cellstr连接后:

b_from_a = strcat('xx', cellstr(num2str(a(:), '%-i'))).';

ab

使用strcat从每个字符串中删除xx,然后应用strrep

a_from_b = str2double(strrep(b, 'xx', ''));

答案 1 :(得分:2)

B FROM A

我喜欢使用无证的Matlab函数,并且在这种情况下可以完美地运行:a = [1, 2, 4, 5]; b = sprintfc('xx%d',a) b = 1×4 cell array 'xx1' 'xx2' 'xx4' 'xx5' 。它具有闪电般的速度,允许使用自定义格式将数字向量转换为字符数组的单元格向量:

b = {'xx1', 'xx2', 'xx3', 'xx4'};
a = str2double(strrep(b,'xx',''))

a =
    1     2     3     4

A FROM B

使用替代品非常简单:

{{1}}

答案 2 :(得分:1)

如果您使用循环而不是矢量化函数打开,则可以相当轻松地完成。例如:

clc; clear;

a = [1, 2, 4, 5];
for i = 1:length(a)
    b{i} = strcat('XX', num2str(a(i)));
end
b

返回

b =

  1×4 cell array

{'XX1'}    {'XX2'}    {'XX4'}    {'XX5'}

如果你想走另一条路,你可以这样做。

for i = 1:length(b)
    c(i) = str2double(b{i}(3:end));
end
c

返回

c =

     1     2     4     5

值得注意的是,更好的代码bc都会pre-allocate

答案 3 :(得分:0)

在16b中,MATLAB添加了一个新的字符串类,在17a中,您可以用双引号构造一个字符串。使用字符串,

"xx" + a

会给你想要的答案。以下是字符串与其他解决方案的性能比较:

>> profFunc
matlabbit solution: 0.29956
Luis Mendo solution: 15.2378
OmG solution 1: 41.0055
OmG solution 2: 29.1976
Tommaso Belluzzo solution: 1.3574


function  profFunc

    a = [1, 2, 4, 5];

    n = 1E5;

    tic;
    for i = 1:n
        ans = "xx" + a;
    end
    disp("matlabbit solution: " + toc);

    tic;
    for i = 1:n
        ans = strcat('xx', cellstr(num2str(a(:), '%-i'))).';
    end
    disp("Luis Mendo solution: " + toc);

    tic;
    for i = 1:n
        xxs = cell(1,4);
        xxs(:) = {'XX'};
        q = cell(1,4); q{1}=1;q{2}=2;q{3}=4;q{4}=5;
        ans = cellfun(@(x,i) strcat(x, num2str(i)), xxs,q, 'UniformOutput', false);
    end
    disp("OmG solution 1: " + toc);

    tic;
    for i = 1:n
        ans = cell(1,length(a));
        for i = 1:length(a)
             ans{i} = strcat('XX',num2str(a(i)));
        end 
    end
    disp("OmG solution 2: " + toc);

    tic;
    for i = 1:n
        ans = sprintfc('xx%d',a);
    end
    disp("Tommaso Belluzzo solution: " + toc);
end