Add new "datetime" elements to an existing cell array (matrix)
現在この質問をフォロー中です
- フォローしているコンテンツ フィードに更新が表示されます。
- コミュニケーション基本設定に応じて電子メールを受け取ることができます。
エラーが発生しました
ページに変更が加えられたため、アクションを完了できません。ページを再度読み込み、更新された状態を確認してください。
古いコメントを表示
What I have so far:
a = cell(3,3);
index = [1 1
2 1
3 3];
b = datetime({'00:01:35'
'00:01:11'
'00:04:21'});
idx = sub2ind(size(a),index(:,1),index(:,2))
idx = 3×1
1
2
9
a(idx) = num2cell(b)
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21]}
What I need / Desired output: add further elements to the cell array (matrix) "a".
% For example, add the new element "datetime({'00:01:01'})"
% to the cell "index = [3 3]", i.e. "idx = 9":
a =
3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21], [24-Oct-2022 00:01:01]}
My attempt:
new_element = datetime({'00:01:01'});
a(9) = a + num2cell(new_element)
Operator '+' is not supported for operands of type 'cell'.
採用された回答
I am not certain what a more universal end result would look liks, however this seems to work for this problem —
a = cell(3,3);
index = [1 1
2 1
3 3];
b = datetime({'00:01:35'
'00:01:11'
'00:04:21'});
idx = sub2ind(size(a),index(:,1),index(:,2))
idx = 3×1
1
2
9
a(idx) = num2cell(b)
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21]}
new_element = datetime({'00:01:01'})
new_element = datetime
24-Oct-2022 00:01:01
a{9} = [a{9} new_element] % Concatenate
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21 24-Oct-2022 00:01:01]}
The operation is a simple concatenation, using the [] concatenation operators.
.
6 件のコメント
But, what if I have 2 or more elements to add to the cell array "a" ? Can I still use the concatenation ?
For example, if I want to add one new element to the cell "8" and one new element to the cell "9", i.e. ?
new_elements = datetime({'00:01:01' ...
'00:01:56'});
a{[8 9]} = [a{[8 9]} num2cell(new_elements)]
I get an error
Error using datetime/horzcat
All inputs must be datetimes or date/time character vectors or date/time strings.
Error in untitled (line 14)
a{[8 9]} = [a{[8 9]} num2cell(new_elements)]
As always, my pleasure!
The second num2cell call is not necessary, since ‘new_element’ or ‘new_elements’ do not need to be cell arrays themselves. Also, in my tweak to your original code, the previous value stored in ‘a(9)’ is retrieved as ‘a{9}’ allowing the concatenation to proceed.
The previous concatenation approach works here as well —
a = cell(3,3);
index = [1 1
2 1
3 3];
b = datetime({'00:01:35'
'00:01:11'
'00:04:21'});
idx = sub2ind(size(a),index(:,1),index(:,2))
idx = 3×1
1
2
9
a(idx) = num2cell(b)
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21]}
new_elements = datetime({'00:01:01' ...
'00:01:56'});
a{9} = [a{9} new_elements] % Concatenate
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21 24-Oct-2022 00:01:01 24-Oct-2022 00:01:56]}
Since I am not exactly certain where this is starting from, confirming this —
a = cell(3,3);
index = [1 1
2 1
3 3];
b = datetime({'00:01:35'
'00:01:11'
'00:04:21'});
idx = sub2ind(size(a),index(:,1),index(:,2))
idx = 3×1
1
2
9
a(idx) = num2cell(b)
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21]}
new_element = datetime({'00:01:01'})
new_element = datetime
24-Oct-2022 00:01:01
a{9} = [a{9} new_element] % Concatenate
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21 24-Oct-2022 00:01:01]}
new_elements = datetime({'00:01:01' ...
'00:01:56'});
a{9} = [a{9} new_elements] % Concatenate
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21 24-Oct-2022 00:01:01 24-Oct-2022 00:01:01 24-Oct-2022 00:01:56]}
view_a_9 = a(9) % Confirm Result
view_a_9 = 1×1 cell array
{[24-Oct-2022 00:04:21 24-Oct-2022 00:01:01 24-Oct-2022 00:01:01 24-Oct-2022 00:01:56]}
Repeated concatenations work as well, duplicating the original second datetime value, if desired.
.
However, I meant something slighlty different, i.e. to add two new elements at the same time into two different cells, and not into the same cell as you have shown (cell [3 3])....
I try to write down what I meant.... and sorry for not having explained clearly, my fault ! :-) ....and, please let me know if I need to create a new question in Matlab Ask...
% (1) create the cell array / matrix "a"
a = cell(3,3);
% (2) add the first elements to the cell array / matrix "a"
index = [1 1
2 1
3 3];
b = datetime({'00:01:35'
'00:01:11'
'00:04:21'});
idx = sub2ind(size(a),index(:,1),index(:,2));
a(idx) = num2cell(b)
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {0×0 double }
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21]}
Here below I show what I need, but without the loop for (if possible)!
% (3) add two new elements:
% - one new element inside the cell [2 3]
% - one new element inside the cell [3 3]
index2 = [2 3
3 3];
new_elements = datetime({'00:01:01'
'00:01:56'});
idx2 = sub2ind(size(a),index2(:,1),index2(:,2));
for i = 1 : size(idx2,1)
a{idx2(i)} = [a{idx2(i)} new_elements(i)];
end
a,
a = 3×3 cell array
{[24-Oct-2022 00:01:35]} {0×0 double} {0×0 double }
{[24-Oct-2022 00:01:11]} {0×0 double} {[24-Oct-2022 00:01:01 ]}
{0×0 double } {0×0 double} {[24-Oct-2022 00:04:21 24-Oct-2022 00:01:56]}
Star Strider
2022 年 10 月 24 日
The loop (or some version of it) is likely the only way to do what you want. All my attempts at using multiple indexing to do it with the concatenation failed.
.
(I have just opened a new question about this issue, but maybe better to close it...)
Star Strider
2022 年 10 月 24 日
As always, my pleasure!
その他の回答 (0 件)
カテゴリ
ヘルプ センター および File Exchange で Matrices and Arrays についてさらに検索
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
