Как сделать символ «^» в MATLAB? - PullRequest
6 голосов
/ 19 ноября 2009

^ - экспоненциальный оператор в MATLAB. Проблема в том, что его нет на многих неанглийских раскладках клавиатуры, и если вы часто используете его в своей работе, переключение между HR и EN становится проблематичным.

Есть ли способ добавить его на панель инструментов MATLAB (как в Excel, чтобы вы могли использовать его с помощью мыши или сенсорной панели), или определить пользовательскую клавишу (например, F12) в MATLAB для ее замены?

Я надеюсь на решение, отличное от AHK, и тому подобное.

Ответы [ 6 ]

11 голосов
/ 19 ноября 2009

Создайте ярлык на панели инструментов, дайте ему имя и поместите в обратный вызов следующее:

clipboard('copy','^')

Запустив это, вы поместите экспоненту ^ в буфер обмена. После того, как вы нажмете его, выполните Ctrl + V , чтобы вставить его.

Вы можете применить эту идею для создания библиотеки клипов фрагментов, доступных из меню Пуск MATLAB.

11 голосов
/ 19 ноября 2009

В Windows (с включенной Num Lock), удерживая нажатой Alt , введите 9 4 на цифровой клавиатуре и отпустите Alt . ^ будет вставлен в курсор.

Это общая техника для вставки произвольных символов Unicode в Windows, независимо от того, находятся ли они на клавиатуре.

Символ ^ равен U+5E, то есть 94 в десятичном виде.

6 голосов
/ 19 ноября 2009

Я бы предложил загрузить представление EditorMacro с Яир Альтман на MathWorks File Exchange . Если вы запустили следующий код в командном окне MATLAB (при открытом редакторе MATLAB):

EditorMacro('Alt 6','^');

это создаст макрос в контексте редактора и командного окна MATLAB, который вставит строку ^ в позицию каретки, когда вы нажмете комбинацию клавиш Alt + 6 (насколько я знаю, его не следует привязывать к каким-либо другим макросам / операциям).

Поскольку вы упоминаете переключение между клавишами Хорватский и Английский , вероятно, раздражает необходимость запоминать различные комбинации клавиш для одних и тех же символов. Используя EditorMacro, вы можете создать набор макросов в редакторе и командном окне MATLAB, который позволит вам использовать один и тот же набор нажатий клавиш для каждого символа независимо от типа используемой клавиатуры.

Поскольку макросы, созданные с помощью EditorMacro, удаляются при каждом закрытии MATLAB, вы можете создать startup.m файл (который будет запускаться автоматически при каждом открытии MATLAB), чтобы создать макросы для вы. Файл может выглядеть примерно так:

edit;                      %# Open the Editor so EditorMacro works properly
EditorMacro('Alt 5','%');  %# Create "%" macro
EditorMacro('Alt 6','^');  %# Create "^" macro
EditorMacro('Alt 7','&');  %# Create "&" macro
...

В этом примере я в основном воспроизводлю поведение Shift плюс число на английской клавиатуре, используя вместо этого Alt .


А если ничего не помогает ...

Вы всегда можете использовать функциональные формы арифметических операторов в качестве крайней меры:

  • power(A,B) вместо поэлементной силовой операции A.^B
  • mpower(A,B) вместо питания матрицы A^B

Это не будет красиво, но это будет работать.

3 голосов
/ 19 ноября 2009

Какая у вас клавиатура, чтобы ее не было?

http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx

Мы быстро проверили этот вопрос, увидев этот вопрос, и не нашли клавиатуру без символа.

Поговорили с нашей командой MATLAB I18N об этом и отправили запрос на улучшение.

2 голосов
/ 24 ноября 2009

Хорошо ... Вот хак, который позволяет вам переназначить произвольные нажатия клавиш в командном окне и редакторе Matlab. Это неподдерживаемый хак, который включает недокументированные внутренние компоненты IDE. Но это "магия", на которую вы надеялись. У меня работает в R2008b и R2009b.

Сначала определите Java-класс, который может обрабатывать события, заменяя их другим вводом нажатия клавиши. Скомпилируйте это в JAR и поместите в javaclasspath вашего Matlab.

package test;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.text.JTextComponent;
import javax.swing.text.TextAction;

/**
 * An action that responds to an event with another keystroke.
 */
public class KeyReplacementAction extends TextAction {

    private final char replacement;

    /**
     * @param name Name of this action (ignored in practice)
     * @param replacement char to replace the event with
     */
    public KeyReplacementAction(String name, char replacement) {
        super(name);
        this.replacement = replacement;
    }

    public void actionPerformed(ActionEvent e) {
        if (!(e.getSource() instanceof JTextComponent)) {
            return;
        }
        JTextComponent src = (JTextComponent) e.getSource();
        KeyEvent replacementEvent = new KeyEvent(src, KeyEvent.KEY_TYPED, 
                java.lang.System.currentTimeMillis(), 0,
                KeyEvent.VK_UNDEFINED, replacement);
        src.dispatchEvent(replacementEvent);
    }

}

Теперь используйте код Matlab для поиска в Swing-виджетах IDE, найдите раскладки клавиш для окна редактора и команд и добавьте обработчики для переназначения к ним.

function remap_keys_in_text_areas()
%REMAP_KEYS_IN_TEXT_AREAS Custom key remapping in Matlab GUI text areas
%
% Must be called after the editor is open, otherwise it won't find the
% editor keymap.

% { from, to; ... }
% Try "disp(char(1:1024))" to see all chars that work in your Matlab font
map = {
    '$' '^'
    '#' char(181)  % might be useful for text formatting
    };

make_sure_editor_is_open(); % otherwise we won't find its keymap

keymaps = find_ide_keymaps();
for i = 1:size(map,1)
    [from,to] = map{i,:};
    disp(sprintf('Re-binding %s to %s in text areas', from, to));
    for j = 1:numel(keymaps)
        bind_keystroke_for(keymaps{j}, from, to);
    end
end

function make_sure_editor_is_open()
s = find_editor_widgets();
if isempty(s.editors)
    edit;
end

function bind_keystroke_for(keymap, from, to)
%BIND_KEYSTROKE_FOR Remap a single keystroke in a text component

import javax.swing.KeyStroke;
import java.awt.event.InputEvent;
import test.KeyReplacementAction;

key = javax.swing.KeyStroke.getKeyStroke(from);
action = KeyReplacementAction(['remap ' from ' to ' to], to);
keymap.addActionForKeyStroke(key, action);

function out = find_ide_keymaps
%FIND_IDE_KEYMAPS Find keymap objects for Matlab IDE widgets
set = java.util.HashSet();
s = find_editor_widgets();
widgets = [s.cmdwin s.editors];
for i = 1:numel(widgets)
    set.add(widgets{i}.getKeymap());
end
set = set.toArray();
out = cell(size(set));
for i = 1:numel(set)
    out{i} = set(i);
end

function out = find_editor_widgets
%FIND_EDITOR_WIDGETS Find editor and command window widgets in Matlab Swing GUI
out.cmdwin = [];
out.editors = {};
wins = java.awt.Window.getOwnerlessWindows();
for i = 1:numel(wins)
    if isa(wins(i), 'com.mathworks.mde.desk.MLMainFrame')
        out.cmdwin = get_command_window_from_mainframe(wins(i));
    elseif isa(wins(i), 'com.mathworks.mde.desk.MLMultipleClientFrame')
        out.editors = [out.editors get_text_areas_from_editor_frame(wins(i))];
    end
end

function out = get_command_window_from_mainframe(frame)
out = findobj_swing_widget(frame, 'com.mathworks.mde.cmdwin.XCmdWndView');

function out = get_text_areas_from_editor_frame(frame)
out = findobj_swing_widget(frame, 'com.mathworks.widgets.SyntaxTextPane');

function out = findobj_swing_widget(widget, klass)
%FINDOBJ_SWING_WIDGET Recursively find all child components of given class
out = {};
if isa(widget, klass)
    out{end+1} = widget;
end
for i = 1:widget.getComponentCount()
    out = [out findobj_swing_widget(widget.getComponent(i-1), klass)];
end

Чтобы активировать переназначения, просто вызовите функцию. Вы можете сделать это из startup.m, чтобы это произошло автоматически.

>> remap_keys_in_text_areas
Re-binding $ to ^ in text areas
Re-binding # to µ in text areas
1 голос
/ 19 ноября 2009

Вы можете просто использовать следующую математическую идентичность:

a^b ≡ exp(b*ln(a))

Я как раз собирался предложить функцию C-style POWER(A,B) вместо функциональности оператора ^, но gnovice превзошло меня. Я полагаю, что именно на этом основаны функции POWER(A,B) и MPOWER(A,B).

Как видно из опубликованных ответов, существует множество альтернатив. Это вопрос вкуса, функциональности и повторения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...