array: concatenate two columns of integers to one colum
5 次查看(过去 30 天)
显示 更早的评论
(Matlab novice)
I thought this would be so easy...
I have a 2-d array of integers and I want to combine two columns like this:
... 123 456 ...
... 123 456 ...
etc...
I want:
... 123456 ...
... 123456 ...
etc...
as single numbers (that is, I want (123 * 1000) + (456)
The number of rows will be variable from one run to the next.
Any help would be appreciated.
1 个评论
Jan
2012-9-13
The question is not clear. What is the wanted output for: [1,2,3,4; 5,6,7,8; 9,10,11,12] ?
采纳的回答
Honglei Chen
2012-9-13
编辑:Honglei Chen
2012-9-13
a = randi([1 100],[5 4]) % a 5x4 integer matrix
b = cellfun(@num2str,{a(:,2:3)},'UniformOutput',false)
c = cellfun(@(x) strrep(x,' ',''), cellstr(b{1}),'UniformOutput',false)
a(:,2) = str2double(c)
a(:,3) = []
2 个评论
Honglei Chen
2012-9-13
@Jan, thanks for the tip. That's a good one. I think you missed a b in your second expression.
更多回答(4 个)
Jan
2012-9-13
编辑:Jan
2012-9-13
A = [1234, 567; 1, 234];
B = A(:, 1) .* nextpow10(A(:, 2)) + A(:, 2);
function Y = nextpow10(X)
Y = 10 .^ floor(log10(abs(n)) + 1); % [EDITED]
Please test this before using, I cannot run Matlab currently.
1 个评论
Andrei Bobrov
2012-9-13
编辑:Andrei Bobrov
2012-9-13
A=randi(67,6,4)
n = ceil(log10(A(:,2:end)));
out = sum(A(:,1:end-1).*(10.^fliplr(cumsum(fliplr(n),2))),2)+ A(:,end)
William Sampson
2012-9-13
2 个评论
Honglei Chen
2012-9-13
It's the same. I updated my answer to show an example of combining 2nd and 3rd column of a matrix
Jan
2012-9-13
编辑:Jan
2012-9-13
See my suggestion:
B = rawData(:, 9) .* nextpow10(rawData(:, 10)) + rawData(:, 10)
result = [rawData(:, 1:8), B, rawData(:, 11:end)]
I do not see, why the suggested method should not work.
Btw. What do you expect as result of two 16 digit numbers? You can store only 16 digits in variables of the type DOUBLE.
Ryan
2012-9-13
编辑:Ryan
2012-9-13
A = [1234, 567; 1, 234]; %Sample Data
% Figure out how many spaces to shift the left column
C = ceil(log10(A(:,2)));
% Find areas where the value is a multiple of 10 or is 1
idx = A(:,2) == 1 | rem(A(:,2),10) == 0;
C(idx) = C(idx) + 1; % Handle the exception
% Determine how much to shift the left column
C = 10.^C;
% Add in the right column
A = A(:,1).*C + A(:,2);
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrices and Arrays 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!