2015-03-02 2 views
1

Скажем, что у меня есть два массива ячеек, A и B, которые содержат строковые значения. Я хочу заполнить структуру S, чтобы я генерировал все возможные комбинации S.valueinA.valueinB = 1. В настоящее время я пытаюсь выполнить это с помощью двух вложенных циклов, которые повторяют все возможные комбинации, и хотел спросить, есть ли более эффективный способ решить эту проблему в MATLAB.Использование содержимого массива ячеек для создания записей структуры

ответ

3

Если вы хотите создать динамические имена полей в структурах, я не вижу, как еще вы можете это сделать без двух циклов for. Предположим, у нас есть две ячейки массива A и B, которые состоят из строковых записей. Для моего примера извиняюсь за строки в этих массивах заранее, поскольку я не мог придумать ничего лучшего на данный момент!

Это то, чего вы пытаетесь достичь?

S = struct(); 
A = {'hello', 'my', 'name', 'is', 'ray'}; 
B = {'i', 'am', 'doing', 'awesome'}; 
for idx = 1 : numel(A) 
    for idx2 = 1 : numel(B) 
     S.(A{idx}).(B{idx2}) = 1; 
    end 
end 

Это создает вложенную структуру S таким образом, что для каждого элемента в A, это становится поле в S, где это поле другой структуры, которая содержит поле с именами, поступающих из всех элементов в B.

Если отображается S, мы получаем:

>> S 

S = 

    hello: [1x1 struct] 
     my: [1x1 struct] 
    name: [1x1 struct] 
     is: [1x1 struct] 
     ray: [1x1 struct] 

Если мы получили доступ к hello поля из S, получим:

>> S.hello 

ans = 

      i: 1 
     am: 1 
     doing: 1 
    awesome: 1 

Аналогично, если мы получили доступ к my поля, мы получаем:

>> S.my 

ans = 

      i: 1 
     am: 1 
     doing: 1 
    awesome: 1 

Следовательно, i е мы хотим получить hello поле, за которой следует am поле, мы делаем:

>> S.hello.am 

ans = 

    1 
+0

@nkjt - лол. Большое спасибо. этот комментарий сделал мое утро. – rayryeng

+0

@rayryeng Спасибо за ответ! Это то, чего я пытался достичь; Я пытался выяснить, был ли у Matlab более эффективный метод (так как это может занять очень много тысяч записей). – n0shadow

+1

@mCode - Ах, я получил. Да, когда дело доходит до имен динамических полей, я не вижу, как вы могли бы это сделать без цикла 'for'. Однако, если вложенное поле состоит всего из одного числа, то я думаю, что он должен быть относительно быстрым. Я еще не проверял его, но это моя догадка. Добро пожаловать, кстати! – rayryeng

Смежные вопросы