repmat function in Simulink

I would like to perform the repmat() function in Simulink. Apparently, there isn't a block for this purpose. So I doing this using the MATLAB function block. Here the following signal dimensions that I'm trying to handle
The code is just:
function y = repmat(u, Ns)
y = repmat(u, [Ns,1,1]); % Ns is a paramater of my system
It works, but using this block is always awkward and inefficient. Is there a clever way to do this?

15 Commenti

hosein Javan
hosein Javan il 16 Ago 2020
Modificato: hosein Javan il 16 Ago 2020
repmat is usally used for element wise operations. if you can tell why even thinking of repmat, maybe there's a better solution of that.
from your diagram I would have expected repmat(u, [1,1, Ns]) unless you wanted a different element order and you had hardwired the output size to prevent conflicts on the number of dimensions.
I do not agree that repmat is used for elementwise operations. That would be repelems
hosein Javan
hosein Javan il 16 Ago 2020
hello Mr. Walter Roberson . for example if we want to multiply each row of a matrix by a vector, that would be repmat(k,[m 1]).*A which is element wise. from my experience, it is a faster way than loops. called vectorization I assume.
If k is a vector with the same number of columns as matrix A, then all you need since R2016b is k.*A . This is "implicit expansion".
hosein Javan
hosein Javan il 16 Ago 2020
I'm using 2016a, thanks for implying that. I'm just concerned that newer versions aren't too RAM-friendy!
bsxfun for earlier releases
hosein Javan
hosein Javan il 17 Ago 2020
great help. thank you. I see that bsxfun is for element.wise operation. if the operation was not element wise like "A\b", I assume the best way is arrayfun, isn't it?
If you repmat to create A for A\b then the array will be singular.
If you repmat to create rows of b then that could be valid. You would not use arrayfun for that.
If you repmat to create columns of b then it would be more efficient to instead repmat the output, as the \ operator will give the same results for all columns of b that are identical columns.
Man... What is the answer to my question?
Use a selector block. Choose 2 dimensions for input. For your first dimension, tell it to select all. For your second dimension, tell it to use a vector from dialog. In the dialog space, enter
repmat(1:2, 1, Ns)
assuming here that the size of the second dimension is 2.
Now connect a reshape() block to the output of that, and specify output dimensions [1, 2, Ns*2]
Rubem Pacelli
Rubem Pacelli il 5 Nov 2020
Modificato: Rubem Pacelli il 5 Nov 2020
Thank you! I think you meant to say [1, 2, Ns] instead of [1, 2, Ns*2]. Before the reshape I have a [1x2*Ns] vector. Hence, it is not possible to reshape to [1, 2, Ns*2]. When I put [1, 2, Ns] in a reshape block, I got a matrix in a shape that I was looking for. :)
Yes, you are right, [1, 2, Ns]

Accedi per commentare.

 Risposta accettata

Ivan Garcia
Ivan Garcia il 30 Lug 2021
Modificato: Ivan Garcia il 30 Lug 2021

0 voti

You can model the repmat function used in the MATLAB function block above in Simulink as follows:
If the input array "u" has 2 dimensions feed it into a "Reshape" block. Set the output dimensionality to "Customize" and then set the output dimensions to: [1, XSize, YSize], where XSize and YSize are the dimension sizes of the original array. This will expand the third dimension. Then feed the output of the reshape block into a "Selector" block. Set the number of input dimensions to 3. Then for the first dimension set the index option to "Index vector (dialog)" and set the index value to "ones(1, Ns)". For the other two dimensions set the index option to "Select all".
Hope this helps.

Più risposte (0)

Prodotti

Release

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by