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

Bow*_*cho 6 arrays matlab

我有两个向量a,b作为一个例子:

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]; 
Run Code Online (Sandbox Code Playgroud)

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

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];

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

das*_*sin 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
Run Code Online (Sandbox Code Playgroud)

性能

我试图在这个方法,Luis Mendo的方法for循环之间进行快速比较(参见例如A. Visser的回答).我创建了两个数组,其伪随机数从1到50和501到1000,并计算数组大小从1到300的计算,忽略字符串转换.

性能比较

Luis Mendo的anwer是明显的赢家,在时间复杂度方面arrayfun似乎与之相提并论bsxfun.该for循环的票价差多少,除了非常小的数组大小,但我不知道的时机才会有信任.

代码可以在这里找到.我很乐意得到一些反馈,我对这些测量有点不确定.


Lui*_*ndo 5

这可以在没有循环的情况下完成(无论是for,arrayfun还是cellfun)使用bsxfun掩蔽功能.如果"字符串"具有不同的长度,这也适用,如下例所示.

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).';
Run Code Online (Sandbox Code Playgroud)

这个例子的结果是:

C =
     1     2     3     2     3     4     5     3     4     5     6
Run Code Online (Sandbox Code Playgroud)