我需要在MATLAB中将一些元素组合成行矩阵的一个元素。例如,我的矩阵是
[1 2 3 4 5 6 7 8]
。我想像[1234 5678]
那样转换矩阵。请帮我这样做。
答案 0 :(得分:3)
考虑以下用于组合单个数字的通用数值解法的匿名函数:
combineDigits = @(x) x*(10.^(length(x)-1:-1:0)).';
x
的每个元素必须位于[0,9]
上(即单个数字)。对于您的示例输入:
>> x = [1 2 3 4 5 6 7 8]
x =
1 2 3 4 5 6 7 8
>> x1 = x(1:4); x2 = x(5:end);
>> combineDigits(x1)
ans =
1234
>> combineDigits(x2)
ans =
5678
>>
匿名函数combinedDigits
可以应用于任何通用实用程序函数,例如cellfun
,以处理数据块。例如,考虑数字的2x8
矩阵M
,划分为2x2
数字数组的1x4
单元数组:
>> M = randi(9,2,8)
M =
4 8 6 8 7 7 6 7
9 9 1 9 7 4 2 1
>> Mpartitioned = mat2cell(M,[1 1],[4 4]) % specify ANY valid partitioning here
Mpartitioned =
[1x4 double] [1x4 double]
[1x4 double] [1x4 double]
>> Mcompacted = cellfun(combineDigits,Mpartitioned)
ans =
4868 7767
9919 7421
答案 1 :(得分:1)
您可以按照以下方式执行此操作:
a=[1 2 3 4 5 6 7 8];
vec1=a(1:4) %put a suitable number here
vec1=num2str(vec1);
vec1(ismember(vec1,' ')) = [];
vec1=str2double(vec1);
类似地,在向量的后半部分执行上述操作序列,并简单地在最终向量中连接它们。
注意:此解决方案仅适用于您在问题中提到的行向量(您提到了行矩阵,但我认为这就是您的意思)。
答案 2 :(得分:1)
这取决于。如果您可以保证您的行总是4的倍数,您可以执行以下操作:
reshape(sum(bsxfun(@times,reshape(Q',4,[])',[1000,100,10,1]),2),[],size(Q,1))';
这样做reshape
矩阵就像这样:
[1 2 3 4 5 6 7 8 -> [1 2 3 4
8 7 6 5 4 3 2 1] 5 6 7 8
8 7 6 5
4 3 2 1]
然后我们按[1000,100,10,1]
对每行进行多次排序并对每行求和:
[1 2 3 4 [1000 200 30 4 [1234
5 6 7 8 -> 5000 600 70 8 -> 5678
8 7 6 5 8000 700 60 5 8765
4 3 2 1] 4000 300 20 1] 4321]
最后,我们再次重塑矩阵以恢复原始形状。
[1234 [1234 5678
5678 -> 8765 4321]
8765
4321]
答案 3 :(得分:1)
首先在数值数组中定义您的值:
a = [1 2 3 4 5 6 7 8];
接下来转换为字符串:
b = num2str(a);
现在删除所有空格:
b(find(b == ' ')) = '';
在中间插入一个空格,然后转换回数字数组(我想这就是你想要的(?)):
c = str2num([b(1:4),' ',b(5:end)]);
那样
>> c(1)
ans =
1234
>> c(2)
ans =
5678
编辑:添加'结束'以涵盖任意范围。