Обработка изображений, 2D свертка [дубликат]

Предположим, у вас есть большой проект, написанный на c ++, который содержит тысячу файлов .cpp и тысячу файлов .h. И давайте предположим, что проект также зависит от десяти статических библиотек. Скажем, мы работаем над Windows, и мы строим наш проект в Visual Studio 20xx. Когда вы нажимаете Ctrl + F7 Visual Studio, чтобы начать компиляцию всего решения (предположим, что у нас есть только один проект в решении)

В чем смысл компиляции?

  • Visual Studio выполните поиск в файле .vcxproj и начните компилировать каждый файл с расширением .cpp. Порядок компиляции не определен. Поэтому вы не должны предполагать, что файл main.cpp скомпилирован сначала
  • . Если файлы .cpp зависят от дополнительных файлов .h, чтобы найти символы, которые могут или не могут быть определены в файл .cpp
  • Если существует один .cpp-файл, в котором компилятор не смог найти один символ, ошибка времени компилятора вызывает сообщение Символ x не может быть найден
  • Для каждого файла с расширением .cpp создается объектный файл .o, а также Visual Studio записывает вывод в файл с именем ProjectName.Cpp.Clean.txt , который содержит все объектные файлы, которые должны обрабатывается компоновщиком.

Второй этап компиляции выполняется Linker.Linker должен объединить весь объектный файл и построить окончательно вывод (который может быть исполняемым или библиотекой)

Шаги по связыванию проекта

  • Разберите все объектные файлы и найдите определение, которое было объявлено только в заголовках (например: Код одного метода класса, как указано в p повторные ответы или событие инициализация статической переменной, которая является членом внутри класса)
  • Если один символ не может быть найден в объектных файлах, он также выполняется в дополнительных библиотеках. Для добавления новой библиотеки в project Свойства конфигурации -> Каталоги VC ++ -> Библиотечные каталоги, и здесь вы указали дополнительную папку для поиска библиотек и Свойства конфигурации -> Linker -> Input для указания имени библиотеки. -Если линкер не смог найти символ, который вы пишете в одном .cpp, он вызывает ошибку времени компоновщика, которая может звучать как error LNK2001: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ)

Наблюдение

  1. После того, как Linker найдет один символ, он не ищет в других библиотеках для него
  2. Порядок ссылок на библиотеки имеет значение.
  3. Если Linker находит внешний символ в одной статической библиотеке, он включает в себя символ на выходе проекта. Однако, если библиотека является общей (динамической), он не включает в себя код (символы) на выходе, но Run-Time могут возникнуть сбои

Как решить эту ошибку

Ошибка времени компилятора:

  • Убедитесь, что вы правильно выполнили синтаксический проект c ++.

Ошибка времени компоновщика

  • Определите все символы, которые вы объявляете в ваших файлах заголовков.
  • Используйте #pragma once, чтобы компилятор не включал один заголовок если он уже был включен в текущий .cpp, который скомпилирован
  • Убедитесь, что ваш exter nal library не содержит символов, которые могут вступать в конфликт с другими символами, которые вы определили в ваших файлах заголовков.
  • Когда вы используете шаблон, чтобы убедиться, что вы включаете определение каждой функции шаблона в файл заголовка для разрешения компилятор для создания соответствующего кода для любых экземпляров.
39
задан Shai 1 December 2013 в 13:47
поделиться

3 ответа

Индексы индексов должны быть либо натуральными целыми числами, либо логическими

. Почти во всех случаях эта ошибка вызвана одной из двух причин. К счастью, для этого есть простая проверка.

Прежде всего убедитесь, что вы находитесь на линии, где происходит ошибка, этого обычно можно достичь, используя dbstop if error, прежде чем запускать свою функцию или скрипт. Теперь мы можем проверить первую проблему:

1. Где-то недопустимый индекс используется для доступа к переменной

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

variableName(index,index)
variableName{index,index}
variableName{indices}(indices)

Теперь просто посмотрите на материал между скобками и выберите каждый индекс. Затем нажмите f9, чтобы оценить результат и проверить, является ли оно реальным положительным целым или логическим. Визуальный осмотр обычно достаточен (помните, что допустимые значения находятся в true, false или 1,2,3, ... BUT NOT 0), но для большой матрицы вы можете использовать такие вещи, как isequal(index, round(index)) или более точно isequal(x, max(1,round(abs(x)))) для проверки действительных натуральных чисел. Чтобы проверить класс, вы можете использовать class(index), который должен возвращать «логический», если все значения являются «истинными» или «ложными».

Обязательно проверьте каждый индекс, даже те, которые выглядят необычно, как в примере ниже. Если все индексы проверяются, вы, вероятно, сталкиваетесь со второй проблемой:

2. Имя функции было омрачено определенной пользователем переменной

. Функции MATLAB часто имеют очень интуитивные имена. Это удобно, но иногда приводит к случайным перегрузкам (встроенным) функциям, т. Е. Созданию переменной с тем же именем, что и функция, например, вы можете пойти max = 9, а для остальной части вашего скрипта / функции Matlab рассмотрит max как вместо переменной max вместо переменной max вы получите эту ошибку, если вы попробуете что-то вроде max([1 8 0 3 7]), потому что вместо возврата максимального значения этого вектора Matlab теперь предполагает, что вы пытаетесь индексировать переменную max и 0 является недопустимым индексом.

Чтобы проверить, какие переменные у вас есть, вы можете посмотреть рабочее пространство. Однако, если вы ищете системный подход, здесь один:

Для каждой буквы или слова, за которым следуют скобки (), и не подтверждено, что на шаге 1 указаны правильные индексы. Проверьте, фактически переменная. Это можно легко сделать, используя which.


Примеры

Простое появление недопустимого индекса

a = 1;
b = 2;
c = 3;
a(b/c)

Здесь мы будем оценивать b/c и найдите, что это не очень округленное число.

Сложное появление недопустимого индекса

a = 1;
b = 2;
c = 3;
d = 1:10;
a(b+mean(d(cell2mat({b}):c)))

Я рекомендую работать наизнанку. Поэтому сначала оцените индексирование самой внутренней переменной: d. Оказывается, cell2mat({b}):c хорошо оценивает целые числа. Затем оцените b+mean(d(cell2mat({b}):c)) и найдем, что у нас нет целочисленного или логического индекса в a.

Здесь мы будем оценивать b/c и находим, что это не очень округленное число.

Перегрузка функции

which mean 
% some directory\filename.m

Вы должны увидеть что-то подобное, чтобы фактически подтвердить, что что-то является функцией.

a = 1:4;
b=0:0.1:1;
mean(a) = 2.5;
mean(b);

Здесь мы видим, что mean случайно назначен. Теперь мы получаем:

which mean
% mean is a variable.
61
ответ дан Dan 26 August 2018 в 04:44
поделиться

В Matlab (и большинстве других языков программирования) знак умножения всегда должен быть записан. Хотя в вашем математическом классе вы, вероятно, узнали, что вместо a*(a+a) вы можете написать write a(a+a), это не то же самое в matlab. Первый - это вызов индексирования или функции, а второй - умножение.

>> a=0

a =

     0

>> a*(a+a)

ans =

     0

>> a(a+a)
Subscript indices must either be real
positive integers or logicals.
4
ответ дан Daniel 26 August 2018 в 04:44
поделиться

Ответы на этот вопрос до сих пор были сосредоточены на источниках этой ошибки, что здорово. Но важно понять мощную, но очень интуитивную функцию индексирования матриц в Matlab. Следовательно, , как работают индексирование и , что является допустимым индексом , во избежание этой ошибки, в первую очередь, используя допустимые индексы.

В своей основе данный массив A длины n, есть два способа его индексирования.

  1. Линейное индексирование: с подмножеством целых чисел из 1 : n (допускаются дубликаты). 0 не допускается, так как массивы Matlab основаны на 1, если вы не используете метод ниже. Для многомерных массивов несколько индексов внутренне преобразуются в линейный индекс , хотя эффективным и прозрачным образом.
  2. Логическое индексирование: в котором вы используете массив n-длины 0s и 1s, чтобы выбрать те элементы, где индексирование истинно. В этом случае уникальный (индекс) должен иметь только 0 и 1.

Итак, допустимый индексный массив в другой массив с n числом элементов ca be:

  1. полностью логичен одного размера или
  2. , линейный с подмножествами целых чисел от 1: n

Помня об этом, неверная ошибка индексации возникает, когда вы смешиваете два типа индексирования: один или несколько нулей встречаются в линейном индексирующем массиве, или вы смешиваете 0 и 1 с чем-то другим, кроме 0 и 1 с :).

Существует много материалов онлайн, чтобы узнать это, включая этот : http://www.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html

4
ответ дан Pradeep Reddy Raamana 26 August 2018 в 04:44
поделиться
Другие вопросы по тегам:

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