# Deleting specific values of fields inside a struct array

19 ビュー (過去 30 日間)
Marc Laub 2020 年 5 月 2 日
コメント済み: Marc Laub 2020 年 5 月 5 日
Hello everyone,
I have a struct array with multiple fields. All fields are arrays with the same length.
a=struct();
a.field1=rand(20,1);
a.field2=rand(20,1);
a.field3=rand(20,1);
Is there away to delet a specific element from all field arrays at the same time?
So for example delete element 3 from field1, field2 and field3 under specific conditions, for example when field3 value==0.5.
I just know this way:
a.field1(a.field3==0.5)=[];
a.field2(a.field3==0.5)=[];
a.field3(a.field3==0.5)=[];
But is it possible to do this in on line instead of handling every field seperatly?
Marc
##### 1 件のコメント-1 件の古いコメントを表示-1 件の古いコメントを非表示
Stephen23 2020 年 5 月 2 日
"But is it possible to do this in on line instead of handling every field seperatly?"
You could use a loop or structfun (which just hides the loop inside).
Note that comparing floating point numbers for exact equality is a common cause of bugs, you should probably compare the absolute difference against a tolerance:
idx = abs(A-B)<tol

サインインしてコメントする。

### 採用された回答

Ameer Hamza 2020 年 5 月 2 日

Something like this
a=struct();
a.field1=rand(20,1);
a.field2=rand(20,1);
a.field3=rand(20,1);
mask = a.field3==a.field3(5); % a.field3(5) is used as example
a = cell2struct(structfun(@(x) {x(~mask)}, a), fieldnames(a));
Result:
>> a
a =
struct with fields:
field1: [19×1 double]
field2: [19×1 double]
field3: [19×1 double]
An alternative way is to use the for-loop. It will probably be faster than the above code because it does not need to create a temporary cell array and recreate the struct.
names = fieldnames(a);
for i=1:numel(names)
end
Note: If you are going to set the value for comparison with a.field3 arbitrarily, i.e., the comparison value is not already an element of the a.field3 itself. The comparison == for floating-point value can fail. In that case, you can define the mask based on tolerance.
mask = abs(a.field3 - 0.5) < 1e-6; % 1e-6 is the tolerance for the comparison with 0.5
##### 5 件のコメント3 件の古いコメントを表示3 件の古いコメントを非表示
Ameer Hamza 2020 年 5 月 2 日
Good point. I assumed that the comparison value would be taken out of the vector itself, e.g., using min(), max(), etc. But if some other operations are performed on the value, then the == comparison can fail.
Marc Laub 2020 年 5 月 5 日
Its ok,
I modified it anyway to:
since my trigger value isalways 2, so its fine.

サインインしてコメントする。

### カテゴリ

Help Center および File ExchangeStructures についてさらに検索

### Community Treasure Hunt

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

Start Hunting!

Translated by