MATLAB “ошибка” (или действительно странное поведение) со структурами и массивами пустой ячейки

Выполните шаги, описанные в руководстве по миграции плагина 3.0.0

Обновите версию Gradle

Для нового плагина Android требуется Gradle версия 4.1-milestone-1 или выше. Если вы открываете существующий проект с помощью Android Studio 3.0 Preview 5 или более поздней версии, следуйте инструкциям для автоматического обновления существующего проекта до совместимой версии Gradle.

Чтобы обновить Gradle вручную, обновите URL в gradle-wrapper.properties следующим образом:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-milestone-1-all.zip

и

Примените плагин

Если вы открываете существующий проект с помощью Android Studio 3.0 Preview 5 или более поздней версии, следуйте инструкциям для автоматического обновления вашего проекта до последней версии плагина Android. Чтобы вручную обновить ваш проект, включите репозиторий Maven и измените версию плагина в файле build.gradle уровня проекта следующим образом:

buildscript {
  repositories {
    ...
    // You need to add the following repository to download the
    // new plugin.
    jcenter()
    google()
  }

  dependencies {

    classpath 'com.android.tools.build:gradle:3.2.1'  //Minimum supported Gradle version is 4.6
  } 
}

7
задан gnovice 30 March 2017 в 04:54
поделиться

4 ответа

Как вы уже заметили, это не ошибка, а «особенность». Другими словами, это нормальное поведение функции STRUCT . Если вы передаете массивы пустых ячеек в качестве значений полей в STRUCT, предполагается, что вам нужен массив пустой структуры с заданными именами полей.

>> s=struct('a',{},'b',{})

s = 

0x0 struct array with fields:
    a
    b

Чтобы передать пустой массив ячеек в качестве фактического значения поля, вы должны сделать следующее:

>> s = struct('a',{{}},'b',{{}})

s = 

    a: {}
    b: {}

Между прочим, каждый раз, когда вы хотите установить значение поля в массив ячеек с помощью STRUCT, требуется, чтобы вы заключили его в другой массив ячеек. Например, это создает один элемент структуры с полями, которые содержат массив ячеек и вектор:

>> s = struct('strings',{{'hello','yes'}},'lengths',[5 3])

s = 

    strings: {'hello'  'yes'}
    lengths: [5 3]

Но это создает массив из двух элементов структуры, распределяя массив ячеек, но реплицируя вектор:

>> s = struct('strings',{'hello','yes'},'lengths',[5 3])

s = 

1x2 struct array with fields:
    strings
    lengths

>> s(1)

ans = 

    strings: 'hello'
    lengths: [5 3]

>> s(2)

ans = 

    strings: 'yes'
    lengths: [5 3]
15
ответ дан 6 December 2019 в 09:21
поделиться

ARGH ... Думаю, я нашел ответ. struct () имеет несколько вариантов поведения, включая:

Примечание. Если любое из полей значений массив пустых ячеек {}, MATLAB программное обеспечение создает пустую структуру массив, в котором все поля также empty.

и, очевидно, если вы передадите член структуры 0x0 в качестве аргумента, это будет похоже на какой-то пустой фантом, который на самом деле не отображается в списке аргументов. (это все еще, вероятно, ошибка)

bug2.m:

function bug2(arg1, arg2)
disp(sprintf('number of arguments = %d\narg1 = ', nargin));
disp(arg1);

контрольный пример:

>> nothing = struct('something',{})

nothing = 

0x0 struct array with fields:
    something

>> bug2(nothing,'there')
number of arguments = 2
arg1 = 
>> bug2(nothing.something,'there')
number of arguments = 1
arg1 = 
there
2
ответ дан 6 December 2019 в 09:21
поделиться

Вывод идентичен в R2008b:

>> bug1
X=
str=
boing
X=
test
str=
??? Input argument "str" is undefined.

Error in ==> bug1>add_something at 11
    disp(str);

Error in ==> bug1 at 4
add_something(S.something,'test');  % weird behavior
1
ответ дан 6 December 2019 в 09:21
поделиться

Такое поведение сохраняется и в 2008b, и на самом деле не является ошибкой (хотя я бы не сказал, что разработчики предназначались для этого): Когда вы войдете в add_something (S, 'boing') и посмотрите первый аргумент (скажем, выбрав его и нажав F9), вы получите некоторый вывод, относящийся к пустой структуре S. Войдите в add_something (S.something, 'test') и посмотрите первый аргумент, и вы увидите, что он фактически интерпретируется как 'test'!

Синтаксис struct.fieldname предназначен для возврата объекта типа 'запятая разделенный список '. Функции в Matlab предназначены для получения объекта именно этого типа: имена аргументов присваиваются значениям в списке в порядке их передачи. В вашем случае, поскольку первый аргумент - это пустой список , список, разделенный запятыми, который получает функция, действительно начинается со второго переданного вами значения, а именно «test».

2
ответ дан 6 December 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: