matlab в C++ C и C++ C в [закрытом] matlab

- (NSImage *)imageTintedWithColor:(NSColor *)tint 
{
    if (tint != nil) {
        NSSize size = [self size];
        NSRect bounds = { NSZeroPoint, size };
        NSImage *tintedImage = [[NSImage alloc] initWithSize:size];

        [tintedImage lockFocus];

        CIFilter *colorGenerator = [CIFilter filterWithName:@"CIConstantColorGenerator"];
        CIColor *color = [[[CIColor alloc] initWithColor:tint] autorelease];

        [colorGenerator setValue:color forKey:@"inputColor"];

        CIFilter *monochromeFilter = [CIFilter filterWithName:@"CIColorMonochrome"];
        CIImage *baseImage = [CIImage imageWithData:[self TIFFRepresentation]];

        [monochromeFilter setValue:baseImage forKey:@"inputImage"];     
        [monochromeFilter setValue:[CIColor colorWithRed:0.75 green:0.75 blue:0.75] forKey:@"inputColor"];
        [monochromeFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputIntensity"];

        CIFilter *compositingFilter = [CIFilter filterWithName:@"CIMultiplyCompositing"];

        [compositingFilter setValue:[colorGenerator valueForKey:@"outputImage"] forKey:@"inputImage"];
        [compositingFilter setValue:[monochromeFilter valueForKey:@"outputImage"] forKey:@"inputBackgroundImage"];

        CIImage *outputImage = [compositingFilter valueForKey:@"outputImage"];

        [outputImage drawAtPoint:NSZeroPoint
                        fromRect:bounds
                       operation:NSCompositeCopy
                        fraction:1.0];

        [tintedImage unlockFocus];  

        return [tintedImage autorelease];
    }
    else {
        return [[self copy] autorelease];
    }
}

- (NSImage*)imageCroppedToRect:(NSRect)rect
{
    NSPoint point = { -rect.origin.x, -rect.origin.y };
    NSImage *croppedImage = [[NSImage alloc] initWithSize:rect.size];

    [croppedImage lockFocus];
    {
        [self compositeToPoint:point operation:NSCompositeCopy];
    }
    [croppedImage unlockFocus];

    return [croppedImage autorelease];
}
10
задан Amro 29 October 2011 в 03:04
поделиться

2 ответа

У меня есть только опыт вызова функций C или C ++ из MATLAB. Мне кажется, что единственная разница между вызовом функций в общей библиотеке и вызовом функций из MEX-файла заключается в том, что с общей библиотекой вы должны вызывать функцию с помощью 'calllib', которая является функцией типа командной строки, а функции MEX позволяют вы должны вызывать функции, как если бы они были встроенными, чтобы интерфейс был немного чище.

Я предлагаю использовать файлы MEX, если

  • Вы используете C ++ (возможно, вам придется написать оболочку для использования C ++ в разделяемой библиотеке)
  • Вы используете MATLAB в качестве связующего звена для большого количества оптимизированных подпрограмм C или C ++. Вы захотите иметь возможность вызывать их чисто.

Используйте разделяемую библиотеку, если

  • У вас уже есть существующая библиотека C, которую можно использовать без изменений.
  • Вам нужно всего лишь небольшое количество вызовов функций C.

На самом деле все сводится к интерфейсу. Я лично предпочитаю путь к файлу MEX, потому что он обеспечивает самый чистый интерфейс от MATLAB к вашей функции C или C ++. Вы можете вызвать это как еще одну функцию со стандартными типами MATLAB. С общей библиотекой вам, возможно, придется отформатировать данные перед вызовом библиотечной функции

8
ответ дан 4 December 2019 в 01:02
поделиться

Я думаю, что методы, которые вы назвали, верны (я давно их не использовал)

C-компилятор Matlab на самом деле не особенный; можно использовать разные компиляторы. См. ссылку список поддерживаемых компиляторов. Это не включает gcc, но MS Visual Studio включена. Вы столкнетесь с проблемами при компоновке с поставляемыми библиотеками.

В основном: вызов Matlab из C - это то, что вы бы сделали, если вам нужен жесткий интерфейс; например, если вы хотите синхронизировать 2 инструмента, или ваша S-функция (simulink) требует дополнительной информации. Но тогда такой файл, вероятно, в первую очередь вызывается Matlab / simulink.

Вызов c из Matlab - это то, что вы хотите сделать, если вы пишете свои собственные S-функции или расширения для Matlab.

Выбор между C и C ++ за вами; если вы начинаете с чистого листа, я предлагаю вам использовать C ++; вам не нужно использовать полную функциональность, но это дает больше свободы. Также в настоящее время для C ++, как правило, доступно больше библиотек.

C - предпочтительный язык, если вам нужно перейти на очень разные среды; например, чтобы скомпилировать C для DSP. Или если у вас есть унаследованный код на C, с которого можно начать. Смешивание C и C ++ возможно, но это может быть немного громоздко; Я уверен, что вы найдете темы на StackOverflow только по этой теме.

Или если у вас есть устаревший код на C, с которого можно начать. Смешивание C и C ++ возможно, но это может быть немного громоздко; Я уверен, что вы найдете темы на StackOverflow только по этой теме.

Или если у вас есть устаревший код на C, с которого можно начать. Смешивание C и C ++ возможно, но это может быть немного громоздко; Я уверен, что вы найдете темы на StackOverflow только по этой теме.

3
ответ дан 4 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

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