Asked by William Sampson
on 13 Sep 2012

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

Answer by Honglei Chen
on 13 Sep 2012

Edited by Honglei Chen
on 13 Sep 2012

Accepted Answer

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

Jan
on 13 Sep 2012

Faster:

b = sprintf('%d%d*', a(:, 2:3).');

c = sscanf(b, '%d*'); [EDITED, thanks Honglei]

STRREP operates on cell string directly, so there is usually no need to create a time-consuming anonymous function inside CELLFUN.

Honglei Chen
on 13 Sep 2012

@Jan, thanks for the tip. That's a good one. I think you missed a b in your second expression.

Sign in to comment.

Answer by Jan
on 13 Sep 2012

Edited by Jan
on 13 Sep 2012

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.

Andrei Bobrov
on 13 Sep 2012

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)

Sign in to comment.

Answer by William Sampson
on 13 Sep 2012

Yeah - so

1) I'm not getting it and

2) I seem to not have been clear enough (sorry...)

what I have is a data array with 59 columns and an indeterminate number of rows and I want to combine 2 (for example) columns as described above. In reality it is 5 columns, 8 - 12, of 16 digits each, but I'll start with getting 2 of them done.

So I have, e.g., rawData(:,9) and rawData(:,10) to combine

Honglei Chen
on 13 Sep 2012

It's the same. I updated my answer to show an example of combining 2nd and 3rd column of a matrix

Jan
on 13 Sep 2012

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.

Sign in to comment.

Answer by Ryan
on 13 Sep 2012

Edited by Ryan
on 13 Sep 2012

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

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 1 Comment

## Jan (view profile)

Direct link to this comment:https://de.mathworks.com/matlabcentral/answers/48089-array-concatenate-two-columns-of-integers-to-one-colum#comment_99167

Sign in to comment.