Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Matlab中从两个向量的索引创建字符串_Arrays_Matlab - Fatal编程技术网

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

Arrays 在Matlab中从两个向量的索引创建字符串,arrays,matlab,Arrays,Matlab,例如,我有两个向量a和b: a=[1234] b=[5 6 7 8] 我想从a和b的索引中创建字符串: 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)=[123456678] 我想要一个通用的解决方案来帮助我自动化这个算法 试试以下

例如,我有两个向量
a
b

a=[1234]
b=[5 6 7 8]

我想从
a
b
的索引中创建字符串:

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)=[123456678]

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

试试以下方法:

A = [1:5; 5:8];, C = [];
for i = A, C = [C i(1):i(2)]; end
Cstr = num2str(C);
我会这样做:

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)

首先,不要将变量分配为
C1
C2
C3
等,使用单元格进行分配

我会使用
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

解决方案中

这应该在不使用循环的情况下实现:

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

性能

我试图在这个方法和
for
循环之间做一个快速比较(参见示例)。我创建了两个伪随机数为1到50和501到1000的数组,并将数组大小的计算时间从1计时到300,忽略字符串转换

Luis Mendo的AWER是明显的赢家,在时间复杂性方面,<>代码> ArayFooy似乎与<>代码> BSXFung相吻合。除了非常小的数组大小外,

循环的
性能要差得多,但我不确定在那里的计时是否可靠


代码可以找到。我很高兴能得到一些反馈,我对这些测量值有点不确定。

这可以不用循环(无论是
for
arrayfun
还是
cellfun
)来完成。如果“字符串”具有不同的长度,也可以这样做,如下例所示

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
只是为了好玩:

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(:).')

难道不是
a(2):b(2)=[3 4 5 6]
?你真的想要字符串而不仅仅是双精度向量吗?是的,你说得对,我做了编辑。我刚开始更改了一些内容,但忘了更新结果。谢谢,我一直在寻找这样的方法。正如你所知,
arrayfun
实际上是一个伪装的for循环,尽管它只适合一行,但做得很好!Benoit_11:但是性能差异非常大,在我的机器上,
循环速度慢了约20-30倍,可能是因为生成的数组无法预先分配-尽管我不是MATLAB性能专家…@dasdingonesin。一般来说,最好使用而不是
tic/toc
来精确计时和基准测试。感谢您为计时所做的努力!正如Hoki所说,
timeit
对于运行时间测量更精确