在Matlab中从两个向量的索引创建字符串

时间:2015-08-21 11:47:17

标签: arrays matlab

我有两个向量ab作为示例:

a = [1 2 3 4]; b = [5 6 7 8];

我想根据ab的索引创建字符串:

c1 = a(1):b(1) = [1 2 3 4 5];
c2 = a(2):b(2) = [2 3 4 5 6];
c3 = a(3):b(3) = [3 4 5 6 7];
c4 = a(4):b(4) = [4 5 6 7 8]; 

然后我想连接获得的字符串:

C = cat(2, c1, c2, c3, c4) = [1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8];

我想要一个通用的解决方案来帮助我自动化这个算法。

6 个答案:

答案 0 :(得分:5)

<强>解决方案

这应该可以在不使用循环的情况下完成:

>> a = [1 3 4 5];
>> b = [5 6 7 8];
>> resultstr = num2str(cell2mat(arrayfun(@(x,y) x:y,a,b,'UniformOutput',false)))

resultstr =

1  2  3  4  5  3  4  5  6  4  5  6  7  5  6  7  8

<强>性能

我尝试对此方法Luis Mendo's methodfor循环进行快速比较(请参阅例如A. Visser's answer)。我创建了两个具有1到50和501到1000的伪随机数的数组,并计算了数组大小从1到300的计算,忽略了字符串转换。

Performance comparison

Luis Mendo的明显赢家,就时间复杂度而言arrayfun似乎与bsxfun相同。 for循环的情况要差得多,除了非常小的数组大小,但我不确定在那里可以信任时机。

可以找到代码here。我很乐意得到一些反馈,我对这些测量结果有点不确定。

答案 1 :(得分:5)

可以使用bsxfun's masking capability在没有循环(forarrayfuncellfun)的情况下完成此操作。这也适用于&#34;字符串&#34;具有不同的长度,如下例所示。

a = [1 2 3];
b = [3 5 6];
m = (0:max(b-a)).'; %'
C = bsxfun(@plus, a, m);
mask = bsxfun(@le, m, b-a);
C = C(mask).';

此示例中的结果是:

C =
     1     2     3     2     3     4     5     3     4     5     6

答案 2 :(得分:1)

尝试类似:

A = [1:5; 5:8];, C = [];
for i = A, C = [C i(1):i(2)]; end
Cstr = num2str(C);

答案 3 :(得分:1)

我会这样做:

a = [1 3 4 5]; b = [5 6 7 8];
c =[];
for i =1:length(a)
    c = [c [a(i):b(i)]];
end
num2str(c)

答案 4 :(得分:1)

首先,不要将变量指定为C1C2C3等,请使用单元格。

我为此使用for - 循环,但可能有更好的选择。

a = [1 3 4 5]; b = [5 6 7 8];
C = [];
for ii = 1:length(a)
    tmp = a(ii):b(ii);
    C = [C tmp];
end

这种方式tmp存储您的单独数组,然后以下行将其添加到预先存在的数组C

答案 5 :(得分:1)

只是为了好玩:

a = [1 2 3 4]; b = [5 6 7 8];

A=fliplr(gallery('circul',fliplr([a,b])));
B=A(1:numel(a)+1,1:numel(a));
C=num2str(B(:).')