从double转换为字符串

时间:2016-04-20 14:17:46

标签: string matlab double

我有双A

的矩阵
  A=[1 1 1 2 1;
     2 1 1 2 1;
     3 1 1 2 1;
     4 1 1 2 1;
     1 2 1 2 1;
     2 2 1 2 1;
     3 2 1 2 1;
     4 2 1 2 1];

我希望将其转换为字符串B

的矩阵
B= {'11121';
    '21121';
    '31121';
    '41121';
    '12121';
    '22121';
    '32121';
    '42121'}.

为此,我尝试使用num2str,但我获得了C,每个字符串中都有两个空格

C = {'1  1  1  2  1';
     '2  1  1  2  1';
     '3  1  1  2  1';
     '4  1  1  2  1';
     '1  2  1  2  1';
     '2  2  1  2  1';
     '3  2  1  2  1';
     '4  2  1  2  1'} 

我不知道如何从C删除空格。

4 个答案:

答案 0 :(得分:6)

执行此操作的一种方法是使用sprintf将数组转换为长数字字符串。然后,您可以将此字符串重塑为适当的形状。然后,您可以使用cellstr将重新整形的字符串的每一行转换为单独的单元格数组元素。

out = cellstr(reshape(sprintf('%d', A), [], size(A,2)));

<强>解释

首先将矩阵转换为长串数字。

s = sprintf('%d', A)
%// 1234123411112222111111112222222211111111 

然后我们想要重塑这个,以便原始数字中的每一行都是输出中的一行数字

s = reshape(s, [], size(A,2))
%// 11121
%// 21121
%// 31121
%// 41121
%// 12121
%// 22121
%// 32121
%// 42121

然后我们可以使用cellstr将其中的每一行转换为自己的单元格数组

out = cellstr(s);
%// '11121'
%// '21121'
%// '31121'
%// '41121'
%// '12121'
%// '22121'
%// '32121'
%// '42121'

一种不同的方法

另一种可以实现此目的的方法是将A的每一列视为一个地点值(即10000个地方,1000个地方,地点,100个地方等等) 。)并将每一行转换为一个整数,知道这一点。这可以通过将每行与10^(N-1:-1:0)数组相乘并对元素求和来轻松完成。这将为组合所有列的每一行产生一个数字。然后我们可以使用num2str将其转换为字符串的单元格数组。

%// Then convert each number to a string in a cell array
out = arrayfun(@num2str, A * (10.^(size(A, 2)-1:-1:0)).', 'uni', 0);

或者为了进一步缩短这一点,我们可以借用@rayryeng's书中的页面并使用sprintfc将这个整数数组转换为字符串的单元格数组:

out = sprintfc('%d', A * (10.^(size(A, 2)-1:-1:0)).');

基准

当您增加行数时,我对此处以及@rayryeng's answerDev-iL's answer中显示的方法的性能感到好奇。我写了一个快速测试脚本。

function tests()
    % Test the number of rows between 100 and 10000
    nRows = round(linspace(100, 10000, 100));

    times1 = zeros(numel(nRows), 1);
    times2 = zeros(numel(nRows), 1);
    times3 = zeros(numel(nRows), 1);
    times4 = zeros(numel(nRows), 1);
    times5 = zeros(numel(nRows), 1);

    %// Generate a random matrix of N x 5
    getRandom = @(n)randi([0, 9], [n, 5]);

    for k = 1:numel(nRows)
        A = getRandom(nRows(k));
        times1(k) = timeit(@()string_reshape_method(A));
        A = getRandom(nRows(k));
        times2(k) = timeit(@()base10_method(A));
        A = getRandom(nRows(k));
        times3(k) = timeit(@()sprintfc_method(A));
        A = getRandom(nRows(k));
        times4(k) = timeit(@()addition_method(A));
    end

    %// Plot the results
    plot(nRows, cat(2, times1, times2, times3, times4)*1000);
    legend({'String Reshape', 'Base-10 Conversion', 'sprintfc', 'addition of "0"'})

    xlabel('Number of Rows in A')
    ylabel('Execution Time (ms)');
end

function out = string_reshape_method(A)
    out = cellstr(reshape(sprintf('%d', A), [], size(A,2)));
end

function out = base10_method(A)
    out = sprintfc('%d', A * (10.^(size(A, 2)-1:-1:0)).');
end

function B = sprintfc_method(A)
    B = sprintfc(repmat('%d', 1, size(A,2)), A);
end

function B = addition_method(A)
    B = cellstr(char(A + '0'));
end

以下是结果。

enter image description here

答案 1 :(得分:5)

我的建议是:

out = cellstr(char(A + '0'));

基本上我们所做的是将0的ASCII值添加到矩阵中,然后将其转换为字符。我没有对它进行基准测试,但它应该相当快:)

答案 2 :(得分:4)

如何使用未记录的内容?我们可以看到每个单元格有5个数字,或每个单元格的总列数。因此,创建一个格式字符串,类似于fprintf %d A所使用的格式字符串,但与s = repmat('%d', 1, size(A,2)); B = sprintfc(s, A); 中的列数重叠,然后使用未记录的函数{{3} }一次性完成从数字到单元格的转换:

>> A=[1 1 1 2 1;2 1 1 2 1;3 1 1 2 1;4 1 1 2 1;1 2 1 2 1;2 2 1 2 1;3 2 1 2 1;4 2 1 2 1];
>> s = repmat('%d', 1, size(A,2));
>> B = sprintfc(s, A)

B = 

    '11121'
    '21121'
    '31121'
    '41121'
    '12121'
    '22121'
    '32121'
    '42121'

运行示例

QScxmlDataModel

答案 3 :(得分:1)

基于num2str输出中“清空空格”的方法:

方法1:

cellfun(@(s)s(s~=' '), num2str(A));

方法2:

regexprep(cellstr(num2str(A)),' ','');