Mapping a cell array on another cell array
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
My objective is to map B on A
A = {[x(2) & x(4)& x(1)],[x(3),x(5)],[x(2),x(1)]}
B = {2465,2514,147,236,58}
where the integers in A are the indices of items in B. I want to replace those indices with actual values as:
C = {[x(2514) & x(236) & x(2465)],[x(147),x(58)],[x(2514),x(2465])}
For loop is a bit slow. Is there an alternative?
2 Kommentare
Antworten (1)
Walter Roberson
am 4 Jun. 2020
No, there is no alternative for that situation. That situation cannot be handled at all, except for the case where x is a vector of unique symbolic variables.
When you do
A = {[x(2) & x(4)& x(1)],[x(3),x(5)],[x(2),x(1)]}
then MATLAB looks up the contents of x(2) and x(4) and so on, and puts the contents into the expression, applying operators as it goes, so x(2) would be replaced with the contents of what is in the second location in x, and then x(4) would be replaced with the contents of what is in the 4th location in x, and then the & operator would be applied between the two values, reducing down to a single value; and then the contents of the first location of x would be looked up and the & operator would be applied between the result of the first & and the x(1), reducing down to a single value. Your A would come out as a cell array in which the first element had one value, the second element had two values, and the third element had two values. MATLAB throws away all information about how the values are derived as soon as the individual value has been produced. After the [x(2) & x(4) & x(1)] operation, MATLAB has no memory that the resulting scalar value has anything to do with x(2) .
Non-symbolic expressions that are not function handles are not patterns of computation. You cannot manipulate the form of how a value was calculated because all information about that has been forgotten.
If you were using function handles, then you could func2str() and do character processing and str2func(). Not so pleasing, but could be done relatively compactly using careful regexprep.
If you were using symbolic expressions and the x values each hold unique symbolic values, then you can use subs().
Note: symbolic expressions can re-arrange themselves.
>> 3 + y*x + 2
ans =
x*y + 5
If the order is important for whatever reason, if it is important that parts not be folded together, then symbolic expressions might not be right for you.
3 Kommentare
Walter Roberson
am 5 Jun. 2020
Afun = @(x) {[x(2) & x(4)& x(1)],[x(3),x(5)],[x(2),x(1)]};
B = {2465,2514,147,236,58};
Bmap = containers.Map(string(1:length(B)), string(B));
new_Afun = str2func(regexprep(func2str(Afun), '(?<=x\()(\d+)(?=\))', '${Bmap($1)}'));
Siehe auch
Kategorien
Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!