Azzera filtri
Azzera filtri

Adding random data to left and right of each element in a matrix

6 visualizzazioni (ultimi 30 giorni)
This is a change from my previous question with random elements instead of fixed elements
Take for example,
i have two 3x4 matrices, M=
1 2 3 4
5 6 7 8
9 10 11 12
and E which shows the number of elements to be added to matrix M, random from 1-4
4 2 1 2
2 3 4 1
1 3 2 3
The elements to be added are random numbers from 0.1 to 0.9, the result to be obtained is shown below
1.3 1.9 1.4 1.1 1 1.5 1.3 1.9 1.7 2.2 2.4 2 2.9 2.5 3.1 3 3.7 4.8 4.2 4 4.4 4.1
5.3 5.8 5 5.5 5.1 6.6 6.1 6.3 6 6.2 6.2 6.7 7.2 7.3 7.2 7.9 7 7.1 7.5 7.4 8.8 8 8.2
9.2 9 9.5 10.9 10.7 10.6 10 10.4 10.3 10.4 11.3 11.4 11 11.1 11.9 12.3 12.9 12.5 12 12.3 12.4 12.8
Next is how do i store this data since it no longer stays as a matrix and is it possible use indexing to find a certain value eg. find(M==2)

Risposta accettata

Stephen23
Stephen23 il 16 Nov 2017
Modificato: Stephen23 il 16 Nov 2017
M = [
1 2 3 4
5 6 7 8
9 10 11 12];
E = [
4 2 1 2
2 3 4 1
1 3 2 3];
%
foo = @(m,e) m+randi(9,1,e)/10;
fun = @(m,e) [foo(m,e),m,foo(m,e)];
C = arrayfun(fun,M,E,'Uni',0);
Giving the output in a cell array C, where each cell contains a vector based on one element of M, e.g. the first column of C:
>> C{:,1}
ans =
1.4000 1.3000 1.9000 1.3000 1.0000 1.9000 1.1000 1.3000 1.9000
ans =
5.6000 5.6000 5.0000 5.9000 5.5000
ans =
9.1000 9.0000 9.3000
>>
" how do i store this data since it no longer stays as a matrix..."
I showed you how to put this into a cell array which is the same size as your original matrices. Alternatively you could extract all of the numeric data and concatenate it into one long numeric vector.
"...and is it possible use indexing to find a certain value eg. find(M==2)"
That depends on how your decide to store it: storing in a cell array requires a different way of searching than if you use one numeric vector.
  6 Commenti
Stephen23
Stephen23 il 16 Nov 2017
Use a cell array, add it as an input to cellfun. something like this::
H = {[0.2 0.8 0.3 0.5],[10,20],...}
M = [...];
fun = @(m,h) [fliplr(h)+m,m,m+h];
cellfun(fun,num2cell(M),H,'Uni',0)
Joseph Lee
Joseph Lee il 20 Nov 2017
Thanks! It works. Now to the indexing part,I will be posting a new question for this.

Accedi per commentare.

Più risposte (1)

Image Analyst
Image Analyst il 16 Nov 2017
Since the padding on either side of each element of M is determined by the value of the corresponding element of E, and the sum of the rows in E do not sum to a constant, the rows in the final result will probably not all be the same length. Thus you will need to use a cell array.
It will be very easy for you to do this yourself once you're read the FAQ on cell arrays: http://matlab.wikia.com/wiki/FAQ#What_is_a_cell_array.3F
  2 Commenti
Joseph Lee
Joseph Lee il 16 Nov 2017
Modificato: Joseph Lee il 16 Nov 2017
Hi, i could try the second part but first, how do i go about the first step, to add the data into my current matrix?
Image Analyst
Image Analyst il 16 Nov 2017
You've accepted an answer so I guess you figured it out.

Accedi per commentare.

Categorie

Scopri di più su Creating and Concatenating Matrices in Help Center e File Exchange

Tag

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by