Удаление ранее созданного дескриптора

Я пытаюсь удалить дескриптор handles.roi1, который я создал.

Я уже пробовал использовать функцию delete:

delete(handles.roi1)

но это дало мне эту ошибку:

Argument must contain a string. 

Моя цель - удалить дескриптор, как будто я его никогда не создавал.

Есть ли у вас какие-либо предложения или советы, как я могу это сделать?


Может я не правильно выразился...

Я делаю графический интерфейс, где я определяю одну кнопку handles.roi1, но затем я хочу удалить ее на другой кнопке. Это потому, что на этой кнопке я делаю:

try a=handles.roi1;
catch
    b=11;

И я хочу, чтобы она досталась catch. Я пытался сделать handles = rmfield(handles, 'roi1');, но это не сработало.


person Pedro Pereira    schedule 26.12.2012    source источник
comment
Что именно вы подразумеваете под удалением дескриптора, как будто я никогда его не создавал? Не могли бы вы предоставить более подробную информацию о вашей проблеме? как именно вы создаете handles.roi1?   -  person Shai    schedule 26.12.2012
comment
Возможно ли, что вы перегрузили функцию delete? не могли бы вы ввести which delete в приглашении вашего Matlab и посмотреть, куда он указывает?   -  person Shai    schedule 26.12.2012


Ответы (2)


Изменить: переписал ответ, чтобы он соответствовал информации, добавленной OP.

Если handles.roi1 создается с imread:

handles.roi1 = imread('test.jpg');

или, сначала сохранив содержимое в переменной a, а затем сделав копию a в handles.roi1 (в этом случае у вас есть 2 копии одних и тех же данных):

a = imread('test.jpg');
handles.roi1 = a;

тогда нет дескрипторов открытых файлов. Кроме того, a и handles.roi1 равны, и они не являются дескрипторами файлов, но каждый из них содержит цветное или полутоновое изображение графического файла test.jpg (в данном примере) .

В MATLAB обычно вы получаете дескриптор файла с помощью fopen, но есть несколько команд файлового ввода-вывода, которые не используют дескрипторы файлов, например, imread, xlsread и fastaread не используют дескрипторы файлов.

В этом случае вы хотите (я полагаю) избавиться от поля roi1 структуры handles (handles.roi1 в синтаксисе MATLAB), поэтому вы можете использовать rmfield таким образом:

handles = rmfield(handles, 'roi1');

Который сохраняет новую копию handles без поля roi1 обратно в ту же структуру с именем handles.

Обратите внимание, что это не имеет ничего общего с дескрипторами файлов или дескрипторами графических объектов. Это просто структура с именем handles, имена которой вы или кто-то путаете с именем handles, несмотря на то, что imread вообще не возвращает ни дескрипторов файлов (ни дескрипторов графических объектов)! Я бы предпочел назвать его imageData вместо handles, потому что именно это он и содержит.

С другой стороны, если handles.roi1 действительно был дескриптором файла, созданным с помощью fopen, вот так:

handles.roi1 = fopen('test.jpg');

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

fclose(handles.roi1);

Или, наоборот, если вы хотите закрыть все открытые файлы, открытые с помощью fopen:

fclose('all');

Затем, когда после fclose вы захотите избавиться от поля roi1 структуры handles (handles.roi1 в синтаксисе MATLAB), вы можете использовать rmfield таким образом (так же, как и в случае imread):

handles = rmfield(handles, 'roi1');

Что сохраняет новую копию handles без поля roi1 обратно в ту же структуру с именем handles.

person nrz    schedule 26.12.2012
comment
handles.roi1 — это матрица изображения, например a=imread('friends.jpg'), и я сделал handles.roi1=a. Но потом я хочу удалить файл handles.roi1. Как мне это сделать? - person Pedro Pereira; 26.12.2012
comment
Не могли бы вы отредактировать свой вопрос, чтобы расширить и уточнить его? Код, с помощью которого вы определяете кнопки, был бы полезен, чтобы иметь возможность ответить на ваш вопрос. - person nrz; 26.12.2012
comment
попробуйте roi1=handles.roi1; ч = неправильный; roi2 = создать маску (ч); roi=roi1+roi2 handles.roi1=roi catch h = imellipse; roi1 = создать маску (ч); Проблема трудно объяснима. Моя проблема в том, что я хочу удалить handles.roi1, чтобы заставить код снова перейти к улову. - person Pedro Pereira; 26.12.2012
comment
Затем вы можете использовать handles = rmfield(handles, 'roi1');. - person nrz; 27.12.2012

Если вы просто хотите удалить часть дескриптора, вы можете сделать, как указано выше:

rmfield(handles, 'roi1');

Если вы хотите удалить весь дескриптор, вы можете сделать:

clear handles
person Dennis Jaheruddin    schedule 27.12.2012
comment
rmfield(handles, 'roi1'); ничего не меняет, потому что rmfield не оператор, это функция (по крайней мере, в R2012a), и она не деструктивна. rmfield(handles, 'roi1'); возвращает только структуру handles без поля roi1. Если вы хотите очистить поле roi1, вам нужно сохранить вывод rmfield обратно в handles (или куда-то еще). - person nrz; 29.12.2012